⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perldebtut.pod

📁 MSYS在windows下模拟了一个类unix的终端
💻 POD
📖 第 1 页 / 共 2 页
字号:
  	DB<3>Useful, huh?  You can eval nearly anything in there, and experiment with bitsof code or regexes until the cows come home:	DB<3> @data = qw(this that the other atheism leather theory scythe)	DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))	atheism	leather	other	scythe	the	theory  	saw -> 6If you want to see the command History, type an 'B<H>':	DB<5> H	4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))	3: @data = qw(this that the other atheism leather theory scythe)	2: x $obj	1: $obj = bless({'unique_id'=>'123', 'attr'=>	{'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')	DB<5>And if you want to repeat any previous command, use the exclamation: 'B<!>':	DB<5> !4	p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))	atheism	leather	other	scythe	the	theory  	saw -> 12For more on references see L<perlref> and L<perlreftut>=head1 Stepping through codeHere's a simple program which converts between Celsius and Fahrenheit, it toohas a problem:	#!/usr/bin/perl -w	use strict;	my $arg = $ARGV[0] || '-c20';	if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {		my ($deg, $num) = ($1, $2);		my ($in, $out) = ($num, $num);		if ($deg eq 'c') {			$deg = 'f';			$out = &c2f($num);		} else {			$deg = 'c';			$out = &f2c($num);		}		$out = sprintf('%0.2f', $out);		$out =~ s/^((\-|\+)*\d+)\.0+$/$1/;		print "$out $deg\n";	} else {		print "Usage: $0 -[c|f] num\n";	}	exit;	sub f2c {		my $f = shift;		my $c = 5 * $f - 32 / 9;		return $c;	}	sub c2f {		my $c = shift;		my $f = 9 * $c / 5 + 32;		return $f;	}For some reason, the Fahrenheit to Celsius conversion fails to return theexpected output.  This is what it does:	> temp -c0.72	33.30 f	> temp -f33.3	162.94 cNot very consistent!  We'll set a breakpoint in the code manually and run itunder the debugger to see what's going on.  A breakpoint is a flag, to whichthe debugger will run without interruption, when it reaches the breakpoint, itwill stop execution and offer a prompt for further interaction.  In normaluse, these debugger commands are completely ignored, and they are safe - if alittle messy, to leave in production code.	my ($in, $out) = ($num, $num);	$DB::single=2; # insert at line 9!	if ($deg eq 'c') 		...	> perl -d temp -f33.3	Default die handler restored.	Loading DB routines from perl5db.pl version 1.07	Editor support available.	Enter h or `h h' for help, or `man perldebug' for more help.	main::(temp:4): my $arg = $ARGV[0] || '-c100';     We'll simply continue down to our pre-set breakpoint with a 'B<c>':  	DB<1> c	main::(temp:10):                if ($deg eq 'c') {   Followed by a window command to see where we are:	DB<1> w	7:              my ($deg, $num) = ($1, $2);	8:              my ($in, $out) = ($num, $num);	9:              $DB::single=2;	10==>           if ($deg eq 'c') {	11:                     $deg = 'f';	12:                     $out = &c2f($num);	13              } else {	14:                     $deg = 'c';	15:                     $out = &f2c($num);	16              }                             And a print to show what values we're currently using:	DB<1> p $deg, $num	f33.3We can put another break point on any line beginning with a colon, we'll useline 17 as that's just as we come out of the subroutine, and we'd like topause there later on:	DB<2> b 17There's no feedback from this, but you can see what breakpoints are set byusing the list 'L' command:	DB<3> L	temp: 		17:            print "$out $deg\n";   		break if (1)     Note that to delete a breakpoint you use 'd' or 'D'.Now we'll continue down into our subroutine, this time rather than by linenumber, we'll use the subroutine name, followed by the now familiar 'w':	DB<3> c f2c	main::f2c(temp:30):             my $f = shift;  	DB<4> w	24:     exit;	25	26      sub f2c {	27==>           my $f = shift;	28:             my $c = 5 * $f - 32 / 9; 	29:             return $c;	30      }	31	32      sub c2f {	33:             my $c = shift;   Note that if there was a subroutine call between us and line 29, and we wantedto B<single-step> through it, we could use the 'B<s>' command, and to stepover it we would use 'B<n>' which would execute the sub, but not descend intoit for inspection.  In this case though, we simply continue down to line 29:	DB<4> c 29  	main::f2c(temp:29):             return $c;And have a look at the return value:	DB<5> p $c	162.944444444444This is not the right answer at all, but the sum looks correct.  I wonder ifit's anything to do with operator precedence?  We'll try a couple of otherpossibilities with our sum:	DB<6> p (5 * $f - 32 / 9)	162.944444444444	DB<7> p 5 * $f - (32 / 9) 	162.944444444444	DB<8> p (5 * $f) - 32 / 9	162.944444444444	DB<9> p 5 * ($f - 32) / 9	0.722222222222221:-) that's more like it!  Ok, now we can set our return variable and we'llreturn out of the sub with an 'r':	DB<10> $c = 5 * ($f - 32) / 9	DB<11> r	scalar context return from main::f2c: 0.722222222222221Looks good, let's just continue off the end of the script:	DB<12> c	0.72 c 	Debugged program terminated.  Use q to quit or R to restart,  	use O inhibit_exit to avoid stopping after program termination,  	h q, h R or h O to get additional info.   A quick fix to the offending line (insert the missing parentheses) in theactual program and we're finished.=head1 Placeholder for a, w, t, TActions, watch variables, stack traces etc.: on the TODO list.	a 	W 	t 	T=head1 REGULAR EXPRESSIONSEver wanted to know what a regex looked like?  You'll need perl compiled withthe DEBUGGING flag for this one:	> perl -Dr -e '/^pe(a)*rl$/i'	Compiling REx `^pe(a)*rl$'	size 17 first at 2	rarest char	 at 0	   1: BOL(2)	   2: EXACTF <pe>(4)	   4: CURLYN[1] {0,32767}(14)	   6:   NOTHING(8)	   8:   EXACTF <a>(0)	  12:   WHILEM(0)	  13: NOTHING(14)	  14: EXACTF <rl>(16)	  16: EOL(17)	  17: END(0)	floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF <pe>'anchored(BOL) minlen 4	Omitting $` $& $' support.	EXECUTING...	Freeing REx: `^pe(a)*rl$'  Did you really want to know? :-)For more gory details on getting regular expressions to work, have a look atL<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,etc. above), see L<perldebguts>.=head1 OUTPUT TIPSTo get all the output from your error log, and not miss any messages viahelpful operating system buffering, insert a line like this, at the start ofyour script:	$|=1;	To watch the tail of a dynamically growing logfile, (from the command line):	tail -f $error_logWrapping all die calls in a handler routine can be useful to see how, and fromwhere, they're being called, L<perlvar> has more information:	BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }Various useful techniques for the redirection of STDOUT and STDERR filehandlesare explained in L<perlopentut> and L<perlfaq8>.=head1 CGIJust a quick hint here for all those CGI programmers who can't figure out howon earth to get past that 'waiting for input' prompt, when running their CGIscript from the command-line, try something like this:	> perl -d my_cgi.pl -nodebug Of course L<CGI> and L<perlfaq9> will tell you more.=head1 GUIsThe command line interface is tightly integrated with an B<emacs> extensionand there's a B<vi> interface too.  You don't have to do this all on the command line, though, there are a few GUIoptions out there.  The nice thing about these is you can wave a mouse over avariable and a dump of it's data will appear in an appropriate window, or in apopup balloon, no more tiresome typing of 'x $varname' :-)In particular have a hunt around for the following:B<ptkdb> perlTK based wrapper for the built-in debuggerB<ddd> data display debuggerB<PerlDevKit> and B<PerlBuilder> are NT specificNB. (more info on these and others would be appreciated).=head1 SUMMARYWe've seen how to encourage good coding practices with B<use strict> andB<-w>.  We can run the perl debugger B<perl -d scriptname> to inspect yourdata from within the perl debugger with the B<p> and B<x> commands.  You canwalk through your code, set breakpoints with B<b> and step through that codewith B<s> or B<n>, continue with B<c> and return from a sub with B<r>.  Fairlyintuitive stuff when you get down to it.  There is of course lots more to find out about, this has just scratched thesurface.  The best way to learn more is to use perldoc to find out more aboutthe language, to read the on-line help (L<perldebug> is probably the nextplace to go), and of course, experiment.  =head1 SEE ALSOL<perldebug>, L<perldebguts>, L<perldiag>,L<dprofpp>,L<perlrun>=head1 AUTHORRichard Foley <richard@rfi.net> Copyright (c) 2000=head1 CONTRIBUTORSVarious people have made helpful suggestions and contributions, in particular:Ronald J Kimball <rjk@linguist.dartmouth.edu>Hugo van der Sanden <hv@crypt0.demon.co.uk>Peter Scott <Peter@PSDT.com>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -