Upload
others
View
6
Download
1
Embed Size (px)
Citation preview
1 Perl 1
1
2
4
6
8
10
12
13
3
5
7
9
11
1
Perl 基础
Perl Perl
Perl
Perl $ @
$a @a
5
@a $a[$i] @a[$i]
9
0 '' ' '
7
Perl Larry Wall Perl
Perl Perl
Perl
Perl
1 Perl
Perl
2000
Perl
2 1 Perl
perldoc
perldoc Perl Perl .pm .pod
POD 82 Perl
perldoc
% perldoc perldoc
PERLDOC(1) User Contributed Perl Documentation
NAME
C - Look up Perl documentation in pod format.
SYNOPSIS
C [-h] [-v] [-t] [-u] [-m] [-l]
perldoc
perltoc
% perldoc perltoc
perlsyn Perl
% perldoc perlsyn
Perl perlfunc
% perldoc perlfunc
perlfunc Perl
Perl
/etc/passwd perlfunc
1 Perl 3
1
2
4
6
8
10
12
13
3
5
7
9
11
-f
% perldoc -f split
perldoc
% perldoc Pod::Simple
-l L
% perldoc -l Pod::Simple
-m
% perldoc -m Pod::Simple
Perl FAQ
perldoc -q
% perldoc -q random
http://perldoc.perl.org/ Perl Perl
HTML PDF
CPAN Search
http://search.cpan.org/ Kobes’s Search http://kobesearch.cpan.org/
CPAN
CPAN Search
4 1 Perl
grep
AnnoCPAN http://annocpan.org/
CPAN Search CPAN::Mini::Webserver
Web MiniCPAN
66 Apache Web Apache::Perldoc Web
perldoc
Pod::POM::Web Web mod_perl CGI
Apache Web
% perl -MPod::POM::Web -e "Pod::POM::Web->server"
perldoc Perl
Web
2 Perl 5
1
2
4
6
8
10
12
13
3
5
7
9
11
2 Perl
Perl 5.10 Perl
Perl 5.10 say print
say 'Hello!'; # print "Hello\n";
Perl 5.10 say
Perl
% perl5.10.1 say.pl #
String found where operator expected at old_script.pl
line 1, near "say "Hello!""
(Do you need to predeclare say?)
-E -e
Perl -E Perl
% perl5.10.1 -E say.pl # 5.10.1
% perl5.12.0 -E say.pl # 5.12.0
use Perl
Perl 83
use 5.010; # 5.10
Perl 5.12 Perl
6 1 Perl
3
use 5.012; # strict
Perl
Perl 5.10 feature
feature bundle Perl
use feature ':5.10';
feature
switch say
use feature qw(switch say);
switch Perl
given-when 24 switch C
Perl 5.10
-E
use VERSION Perl
3
Perl Perl
Perl
3 7
1
2
4
6
8
10
12
13
3
5
7
9
11
Perl
strict Perl
Perl
use strict;
Perl 5.12 Perl
2
use 5.012; # use strict
warnings
99
strict
strict
perl -Mstrict program.pl
Perl vars subs refs
Perl
@temp @tmp
8 1 Perl
my @temp = ;
foreach (@tmp) { # @temp
print "Found $_\n";
}
strict vars
my our
use strict 'vars';
my @temp;
our $temp;
use strict 'vars';
$main::name = 'Buster';
use vars
use strict 'vars';
use vars qw($bar);
$bar = 5;
$_ %ENV strict $a $b
sort 22 Perl
Perl
for ( $i = 0 ; $i < 10 ; $i++ ) {
3 9
1
2
4
6
8
10
12
13
3
5
7
9
11
print $a[i]; # $a[$i]
}
i $i i
i 0 $a[0] strict 'subs'
use strict 'subs';
for ( $i = 0 ; $i < 10 ; $i++ ) {
print $a[i]; #
}
strict 'subs'
use strict 'subs';
$a{name} = 'ok'; #
$a{-name} = 'ok'; #
my %h = (
last => 'Smith', # =>
first => 'Jon'
);
strict refs 58
bug
Perl $not_array_ref
no strict 'refs';
$not_array_ref = 'buster';
@{$not_array_ref} = qw( 1 2 3 ); # @buster
10 1 Perl
Perl
Perl
strict Perl
4
sigil Perl Perl
Perl
$
$scalar
$array[3]
$hash{'key'}
@
Perl
@array
4 11
1
2
4
6
8
10
12
13
3
5
7
9
11
@array[0,2,6] #
@hash{ qw(key1 key2) } #
% Perl
%hash
Perl & *
$ name [3]
$name[3]
$ name [3] name
$ name {'Buster'}
$name{'Buster'}
{}
$
12 1 Perl
$scalar
@array
%hash
59
$
@
5
Perl
$a @a
my $a = 1; # $a = 1
my @a = ( 1, 2, 3 ); # @a = (1,2,3), $a 1
Perl main $a
foo $a
$a = 1; # $main::a = 1
package foo; # foo
$a = 3.1416; # $foo::a 3.1416 $main::a 1
5 13
1
2
4
6
8
10
12
13
3
5
7
9
11
Perl
$ @ % $
4
my $a = 1;
my @a = ( 1, 2, 3 );
my %a = ( a => 97, b => 98 );
$a[3] = 4; # $a 1 @a (1,2,3,4)
$a{'c'} = 99; # $a @a
# %a
Perl &
&
hi
sub hi {
my $name = shift;
return "hi, $name\n";
}
&
print &hi("Fred");
&
print hi("Fred");
perl hi hi
print hi "Fred";
14 1 Perl
TEST
open TEST, '>', "$$.test" # TEST
print TEST "test data\n"; # TEST
opendir TEST, "."; # TEST
# TEST
format TEST = @
6 15
1
2
4
6
8
10
12
13
3
5
7
9
11
'a' lt 'b' #
'a' eq 'A' #
"joseph" eq "joseph " #
C
0 < 5 #
10 == 10.0 #
10 2
'10' gt '2' # '1' '2'
"10.0" eq "10" #
'abc' == 'def' # == 0
my $hacker = 'joebloe';
if ( $user == $hacker ) { # ==
deny_access();
}
Perl sort
22
eq == Perl
~~ 23
16 1 Perl
==
use 5.010;
if ( 123 ~~ '456' ) { ... } #
if ( '123.0' ~~ 123 ) { ... } #
if ( 'Mimi' ~~ 456 ) { ... } #
eq
if ( 'Mimi' ~~ 'Mimi' ) { ... } #
eq
if ( '123.0' ~~ '123' ) { ... } #
$var 8
==
use 5.010;
if ( ( '123' + 0 ) ~~ '123.0' ) { #
say "Matched 1!";
}
my $var = '123';
if ( ( $var + 0 ) ~~ '123.0' ) { #
say "Matched 2!";
}
my $var2 = '123';
$var2 + 0;
if ( $var2 ~~ '123.0' ) { #
say "Matched 3!";
}
Perl
7 17
1
2
4
6
8
10
12
13
3
5
7
9
11
eq
use 5.010;
my $var3 = 123;
$var3 = "$var3";
if ( $var3 ~~ '123.0' ) { # eq
say "Matched 4!";
}
7
Perl
Perl
0 '0' undef ''
Boolean context
?: || && 8
Perl '0'
undef defined
0
18 1 Perl
while ( my $file = glob('*') ) { #
do_something($file);
}
glob glob('*')
$file glob
undef while
0
while defined
while ( defined( my $file = glob('*') ) ) { #
do_something($file);
}
Perl
while STDIN
while () {
do_something($_);
}
Perl $_
while ( defined( $_ = ) ) { #
do_something($_);
}
B::Deparse perl
7 19
1
2
4
6
8
10
12
13
3
5
7
9
11
% perl -MO=Deparse \
-e 'while( ) { do_something($_) }'
while (defined($_ = )) {
do_something($_);
}
-e syntax OK
defined
while ( defined( my $line = ) ) {
do_something($line);
}
Perl
my @cats = qw( Buster Roscoe Mimi );
my $favorite = $cats[8]; # cats undef
undef
my @cats = qw( Buster Roscoe Mimi );
$cats[1] = undef; # Roscoe undef
while ( defined( my $cat = shift @cats ) ) { #
print "I have a cat named $cat\n";
}
foreach
foreach my $cat (@cats) {
next unless defined $cat;
print "I have a cat named $cat\n";
}
undef $#cats
20 1 Perl
for ( my $i = 0 ; $i
8 21
1
2
4
6
8
10
12
13
3
5
7
9
11
8
Perl
Perl
+ Perl
Perl
Perl string context
numeric context
Perl C sprintf()
"%.20g" Perl sprintf
my $n = sprintf "%10.4e", 3.1415927; # "3.1416e+00"
Perl C atof()
Perl
0
my $n = 0 + "123"; # 123
my $n = 0 + "123abc"; # 123
22 1 Perl
my $n = 0 + "\n123"; # 123
my $n = 0 + "a123"; # 0
my $n = 0 + "\x{2165}"; # 0
oct
my $n = 0 + "0x123"; # 0 0
my $n = 0 + oct("0x123"); # 291 oct
print "mode (octal): "; #
chmod , $file; # STDIN
print "mode (octal): "; #
chmod oct(), $file; #
Perl
my $a = 123;
my $b = 234;
my $c = $a & $b; # 106
$a = "$a";
$b = "$b";
my $d = $a & $b; # 020
Devel::Peek
use Devel::Peek qw(Dump);
my $a = '12fred34'; # 12
8 23
1
2
4
6
8
10
12
13
3
5
7
9
11
print STDERR "Before conversion: ";
Dump($a);
my $b = $a + 0;
print STDERR "After conversion: ";
Dump($a);
print STDERR "\n$a\n";
Dump Perl
Perl PV
Perl IV NV
Before conversion: SV = PV(0x801038) at 0x80e770
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x204c10 "12fred34"\0
CUR = 8
LEN = 12
After conversion: SV = PVNV(0x8023c0) at 0x80e770
REFCNT = 1
FLAGS = (PADMY,IOK,NOK,POK,pIOK,pNOK,pPOK)
IV = 12
NV = 12
PV = 0x204c10 "12fred34"\0
CUR = 8
LEN = 12
$!
errno perror()
open ""; #
print "$!\n"; # No such file or directory
print 0 + $!, "\n"; # 2
given-when 24 23
24 1 Perl
use 5.010;
for my $s ( '137', ' 137' ) {
given ($s) {
when ('137') { say "$s matches '137'"; continue }
when (' 137') { say "$s matches ' 137'" }
}
}
137 matches '137'
137 matches ' 137'
use 5.010;
for my $s ( '137', ' 137' ) {
my $t = $s + 0;
given ($s) {
when ('137') { say "$s matches '137'"; continue }
when (' 137') { say "$s matches ' 137'" }
}
}
137 matches '137'
137 matches ' 137'
137 matches '137'
137 matches ' 137'
Perl dualvar
9 25
1
2
4
6
8
10
12
13
3
5
7
9
11
use Scalar::Util qw(dualvar);
sub some_sub {
# ...
if ($error) {
return dualvar( -1,
'You are not allowed to do that' );
}
}
my $return_value = some_sub();
$return_value
Perl
Perl
Perl 0
9
Perl
Perl
26 1 Perl
(localtime)[5]; #
$array[5];
(localtime)[ 5, 4, 3 ]; #
@array[ 5, 4, 3 ];
my @array = qw( Buster Mimi Roscoe );
my $count = @array; # 3
( 'Buster', 'Mimi', 'Roscoe' )
foreach
my @cats = ( 'Buster', 'Mimi', 'Roscoe' );
foreach ( qw( Buster Mimi Roscoe ) ) {
...;
}
9 27
1
2
4
6
8
10
12
13
3
5
7
9
11
qw() @cats
? $scalar
my $scalar = ( 'Buster', 'Mimi', 'Roscoe' );
my $scalar = qw( Buster Mimi Roscoe );
$scalar 3
Perl Roscoe $scalar
my $scalar = ( 1, 2, 3 );
Perl
my $elements = my @array = localtime;
localtime
@array $elements
28 1 Perl
my $elements = ( my @array = localtime );
perlop
localtime
my $elements = () = localtime;
goatse
my $elements =()= localtime;
split
my $count =()= m/(...)/g;
my $count =()= split /:/, $line;
goat
10 undef 29
1
2
4
6
8
10
12
13
3
5
7
9
11
10 undef
Perl undef
undef undef()
my $toast = undef;
undef $history;
() undef
undef undef
Perl undef Perl
@still_going = undef;
if (@still_going) { ... }
()
my @going_gone = ();
undef
undef @going_gone;
undef 0 '' defined defined
if ( defined($a) ) { ... }
if ( defined(@a) ) { ... }
30 1 Perl
undef
$sparse[3] = undef;
@sparse[ 1, 5, 7 ] = ();
@sparse[ 0 .. 99 ] = ();
undef
undef
my @a = 1 .. 10;
$a[9] = undef;
print scalar(@a), "\n"; # "10"
pop
my $val = pop @a;
print scalar(@a), "\n" # "9"
splice
splice @a, -2;
print scalar(@a), "\n"; # "7"
$#array_name
$#a = 4;
print scalar(@a), "\n"; # "5"
undef
Odd number of elements in hash assignment
at program.pl ...
10 undef 31
1
2
4
6
8
10
12
13
3
5
7
9
11
()
%gone = ();
if ( keys %gone ) {
print "This will never print\n";
}
undef
my %nuked = ( U => '235', Pu => 238 );
undef %nuked;
if ( keys %nuked ) {
print "This won't print either\n";
}
if ( defined %nuked ) {
print "Nor will this\n";
}
undef
delete
my %spacers = (
husband => "george",
wife => "jane",
daughter => "judy",
son => "elroy",
);
delete $spacers{'husband'};
if ( exists $spacers{'husband'} ) {
print "Won't print because 'husband' is gone\n";
}
delete @spacers{ 'daughter', 'son' };
undef
undef
exists
32 1 Perl
11
@a[1] Perl
@ $
Perl $
@ 4
@a $n $a[$n] @a[$n]
$
@a[$n] @a $n slice
my @giant = qw( fee fie foe fum );
my @queue = ( $giant[1], $giant[2] );
my @giant = qw( fee fie foe fum );
my @queue = @giant[ 1, 2 ];
my @fifo = ( 1, 2 );
my @queue = @giant[ @fifo ];
@a[1] @a[1, 2] @a[2, 10] @a[5, 3, 1] @a[3..7]
11 33
1
2
4
6
8
10
12
13
3
5
7
9
11
@a[1]
my $jolly = @giant[3];
my $jolly = $giant[3] @giant[3]
@giant[3] $giant[3]
warnings 99 Perl
use warnings;
my @giant = qw( fee fie foe fum );
my $jolly = @giant[3];
fum $jolly
Perl
Scalar value @giant[3] better written as
$giant[3] at ...
( $giant[1], $giant[2] ) = ( "tweedle", "dee" );
34 1 Perl
@giant[ 1, 2 ] = ( "tweedle", "dee" );
STDIN
@info[0] = ;
( $info[0] ) = ;
@info 0
@info[0]
@text 'EOF'
$text[@text] = 'EOF' @text[@text]
chomp( @text = );
@text[@text] = 'EOF';
Perl @text @text
@text @text
11 35
1
2
4
6
8
10
12
13
3
5
7
9
11
0 @text[0, 0, 0,
0, 0, ...] EOF
undef
undef
@a[0]
Perl::Critic 112
Perl
my ( $uid, $gid ) = ( stat $file )[ 4, 5 ];
my $last = ( sort @list )[-1];
my $field_two = ( split /:/ )[1];
@list
@list[ 5 .. 9 ] = reverse @list[ 5 .. 9 ];
@list[ reverse 5 .. 9 ] = @list[ 5 .. 9 ];
@a[ $n, $m ] = @a[ $m, $n ]; # $a[$m] $a[$n]
@item{ 'old', 'new' } =
@item{ 'new', 'old' }; # $item{old} $item{new}
36 1 Perl
22
@uid @name @uid
@name sort @name
@name
@name =
@name[ sort { $uid[$a] $uid[$b] } 0 .. $#name ];
A Z 1 26 26
@char_num{ 'A' .. 'Z' } = 1 .. 26;
@old{ keys %new } = values %new;
%old = ( %old, %new );
delete @name{ keys %invalid };
12 37
1
2
4
6
8
10
12
13
3
5
7
9
11
foreach $key ( keys %invalid ) {
delete $name{$key};
}
12
Perl Larry Wall Perl
Perl
Perl 45
Perl
my $result = '123' + '345'; # 468
my $result = 123 . 345; # 123456
6
38 1 Perl
12 2
1 2
if ( '12' lt '2' ) { print "12 is less than 2!\n"; }
foo bar 0 8
if ( 'foo' == 'bar' ) { print "Oh noes! foo is bar!\n" }
Perl Perl
1 + 2
'foo' . 'bar'
print reverse( 1 .. 10 ), "\n";
while foreach
while ( ) { ... }
foreach ( ) { ... }
12 39
1
2
4
6
8
10
12
13
3
5
7
9
11
__END__ while
while () {
last if /__END__/;
...;
}
my $next_line = ;
foreach
STDIN STDIN
foreach () {
last if /__END__/;
...;
}
my $next_line = ; #
while
my ($n) = ( 'a', 'b', 'c' ); # $n 'a'
my ($n, $m) = ( 'a', 'b', 'c' ); # $n 'a' $m 'b'
my @array = ( 'a', 'b', 'c' );
my @lines = ; #
my ($n)
40 1 Perl
scalar context
my $single_line = ; #
$n
my $n = ( 'a', 'b', 'c' ); # $n 'c'
9
void context
some_sub(@args);
grep { /foo/ } @array;
1 + 2;
Perl grep
1+2 warnings 99 Perl
Useless use of a variable in void context
Perl
Perl
13 41
1
2
4
6
8
10
12
13
3
5
7
9
11
13
Perl 集合 collection
my $fib_0 = 1;
my $fib_1 = 1;
my $fib_2 = 2;
my $fib_3 = 3;
my $fib_4 = 5;
$fib[0] = 1;
$fib[1] = 1;
$fib[2] = 2;
$fib[3] = 3;
$fib[4] = 5;
my @x = ( 1, 1, 2, 3, 5 );
qw()
my @x = qw( 1 1 2 3 5 );
my $x0 = 1;
my $y0 = 1;
my $x1 = 2;
my $y1 = 4;
42 1 Perl
tuple
my @points = ( [ 1, 1 ], [ 2, 4 ] );
foreach my $point (@points) {
print "x: $point->[0] y: $point->[1]\n";
}
my $person_name = 'George';
my $person_id = '3';
my $person_age = 29;
person
some_sub( $person_name, $person_id, $person_age );
person
my %person = (
id => 3,
name => 'George',
age => 29,
);
George
14 bignum 43
1
2
4
6
8
10
12
13
3
5
7
9
11
some_sub( \%person );
my @persons = ( \%person1, \%person2 );
my @persons = ( { id => 1, ... }, { id => 2, ... }, ... );
14 bignum
Perl
32 perl 32
% perl -le 'print 1234567890123456789012345';
1.23456789012346e+24
my $factorial = 1;
foreach my $num ( 1 .. $ARGV[0] ) {
$factorial *= $num;
}
44 1 Perl
print "$factorial\n";
32 perl 18
% perl factorial.pl 17
355687428096000
% perl factorial.pl 18
6.402373705728e+15
21 51 090 942 171 709 440 000
perl
% perl factorial.pl 21
5.10909421717094e+19
perl bignum
use bignum;
my $factorial = 1;
foreach my $num ( 1 .. $ARGV[0] ) {
$factorial *= $num;
}
print "$factorial\n";
% perl factorial.pl 100
93326215443944152681699238856266700490715968264381621
46859296389521759999322991560894146397615651828625369
7920827223758251185210916864000000000000000000000000
14 bignum 45
1
2
4
6
8
10
12
13
3
5
7
9
11
bignum
bignum
bignum Math::BigInt Math::BigFloat
bignum no bignum
{
no bignum;
#
my $sum = $n + $m;
}
bignum
{
use bignum;
#
my $sum = $n + $m;
}
bignum
use Math::BigInt;
my $big_factorial = Math::BigInt->new(1);
foreach my $num ( 1 .. $ARGV[0] ) {
$big_factorial *= $num;
}
print "$big_factorial\n";
bignum
46 1 Perl
Perl
bignum
bignum