1. subroutine
1 sub say {
2 print "$_[0], $_[1]!"n";
3 }
4 say("hello","world"); # hello world, once again
5 say("goodbye","cruel world"); # silent movie lament
6
2.Private Variables in Functions
1 sub bigger_than {
2 my($n,@values); # create some local variables
3 ($n,@values) = @_; # split args into limit and values
4 my(@result); # temporary for holding the return value
5 foreach $_ (@values) { # step through the arg list
6 if ($_ > $n) { # is it eligible?
7 push(@result,$_); # add it
8 }
9 }
10 return @result; # return the final list
11 }
# some invocations:
@this = bigger_than(5,1,5,15,30); # @this gets (15,30)
3.File-Level my( ) Variables
The my() operator can also be used at the outermost level of your program, outside of
any subroutines or blocks. While this isn't really a "local" variable in the sense
defined above, it's actually rather useful,especially when used in conjunction with a
Perl pragma:
use strict;
A pragma is a compiler directive. Other directives include those to set up integer
arithmetic, overload numeric operators, or request more verbose warnings and error
messages.
If you place this pragma at the beginning of your file, you will no longer be able
to use variables (scalars,arrays, and hashes) until you have first "declared" them.
And you declare them with my(), like so:
1 use strict;
2 my $a; # starts as undef
3 my @b = qw(fred barney betty); # give initial value
4
5 push @b, qw(wilma); # cannot leave her out
6 @c = sort @b; # WILL NOT COMPILE
That last statement will be flagged at compile time as an error, because it referred
to a variable that had not previously been declared with my (that is, @c). In other
words,your program won't even start running unless every single variable being used
has been declared. The advantages of forcing variable declarations are twofold:
1. Your programs will run slightly faster (variables created with my are accessed
slightly faster than ordinary variables).
Variables created with my() are not found in any package.
2. You'll catch mistakes in typing much faster, because you'll no longer be able
to accidentally reference a nonexisting variable named $freed when you wanted $fred.
4.The last Statement
1 while (something) {
2 something;
3 something;
4 something;
5 if (somecondition) {
6 somethingorother;
7 somethingorother;
8 last; # break out of the while loop
9 }
10 morethings;
11 morethings;
12 }
13 # last comes here
5.The next Statement
1 while (something) {
2 firstpart;
3 firstpart;
4 firstpart;
5 if (somecondition) {
6 somepart;
7 somepart;
8 next;
9 }
10 otherpart;
11 otherpart;
12 # next comes here
13 }
6.The redo Statement
1 while (somecondition) {
2 # redo comes here
3 something;
4 something;
5 something;
6 if (somecondition) {
7 somestuff;
8 somestuff;
9 redo;
10 }
11 morething;
12 morething;
13 morething;
14 }
7.Expression Modifiers
1 exp2 unless exp1; # like: unless (exp1) { exp2; }
2 exp2 while exp1; # like: while (exp1) { exp2; }
3 exp2 until exp1; # like: until (exp1) { exp2; }
4 some_expression if control_expression; # like if (control_expression) { some_expression;}
8.&& and || as Control Structures
1 if (this) { that; } # one way
2 that if this; # another way
3
4 #Here's a third (and believe it or not, there are still others):
5 this && that;
6 #Likewise, the logical-or works like the unless statement (or unless modifier). So you can replace:
7 unless (this) { that; }
8 #with:
9 this || that;
9.Opening and Closing a Filehandle
1 open(FILEHANDLE,"somename"); #opens the filehandle for reading
2
3 open(OUT, ">outfile"); #open a file for writing
4
5 open(LOGFILE, ">>mylogfile"); #you can open a file for appending
6 close(LOGFILE);
10.A Slight Diversion: die
1 open(DATAPLACE,">/tmp/dataplace") ||
2 die "Sorry, I couldn't create /tmp/dataplace\n";
3
4 die "you gravy-sucking pigs"; #prints the file and line number
5
6 die "you gravy-sucking pigs\n"; #print either
7
8 open(LOG, ">>logfile") || die "cannot append: $!"; # $!: most recent operating system error
11.Using Filehandles
1 open (EP,"/etc/passwd");
2 while (<EP>) {
3 chomp;
4 print "I saw $_ in the password file!\n";
5 }
6 close(EP);
1 open(OUT, ">outfile"); #open a file for writing
2 print OUT "What's going on in this file";
3 close(OUT);