46
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

Perl 基础 - images.china-pub.comimages.china-pub.com/ebook195001-200000/198098/ch001.pdf · 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

  • 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

    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