Perl 510 for People Who Arent Totally Insane 4609

download Perl 510 for People Who Arent Totally Insane 4609

of 184

Transcript of Perl 510 for People Who Arent Totally Insane 4609

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    1/184

    Perl 5.10insanefor people who are not

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    2/184

    Perl 5.10insanetotallyfor people who are not

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    3/184

    perl5100delta

    5.10 isnt like 5.8.x

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    4/184

    perl5100delta

    5.10 isnt like 5.8.x

    -features only get added in new 5.x releases

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    5/184

    perl5100delta

    5.10 isnt like 5.8.x

    -features only get added in new 5.x releases

    - its been 5 years since the last release (5.8)

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    6/184

    perl51000delta

    5.10 is Way Cool

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    7/184perl51000delta

    5.10 is Way Cool

    - no significant new features in Perl since 2002

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    8/184perl51000delta

    5.10 is Way Cool

    - no significant new features in Perl since 2002

    -

    remember how bad you wanted to see Star

    Wars: Episode 1?

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    9/184perl51000delta

    5.10 is Way Cool

    - no significant new features in Perl since 2002

    -

    remember how bad you wanted to see Star

    Wars: Episode 1?

    - thats how excited you should be for 5.10

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    10/184perl51000delta

    5.10 is Way Cool

    - no significant new features in Perl since 2002

    -

    remember how bad you wanted to see Star

    Wars: Episode 1?

    - thats how excited you should be for 5.10

    -but it wont suck (no POD race scene)

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    11/184perl51000delta

    Lexicascopasmartwhat?

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    12/184perl51000delta

    Lexicascopasmartwhat?

    - lexically scoped user pragmata!

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    13/184perl51000delta

    Lexicascopasmartwhat?

    - lexically scoped user pragmata!

    -pluggable regex compilation engines!

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    14/184perl51000delta

    Lexicascopasmartwhat?

    - lexically scoped user pragmata!

    -pluggable regex compilation engines!

    - trie-based non-recursive pattern matching!

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    15/184

    perl51000delta

    Lexicascopasmartwhat?

    - lexically scoped user pragmata!

    -pluggable regex compilation engines!

    - trie-based non-recursive pattern matching!

    -

    thread-safe weak refkey hashes!

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    16/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    17/184

    perl51000delta

    Yes, You Care

    - Not everything in 5.10 is esoteric.

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    18/184

    perl51000delta

    Yes, You Care

    - Not everything in 5.10 is esoteric.

    -Not everything in 5.10 is for gurus.

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    19/184

    perl51000delta

    Yes, You Care

    - Not everything in 5.10 is esoteric.

    -Not everything in 5.10 is for gurus.

    - Not everything in 5.10 is for C programmers.

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    20/184

    perl51000delta

    Yes, You Care

    - Not everything in 5.10 is esoteric.

    -Not everything in 5.10 is for gurus.

    - Not everything in 5.10 is for C programmers.

    -

    Not everything in 5.10 is super advanced.

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    21/184

    feature

    First: A Warning

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    22/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    23/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    24/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    25/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

    - use feature mtfnpy;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    26/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

    - use feature mtfnpy;

    -

    use 5.010;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    27/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

    - use feature mtfnpy;

    -

    use 5.010;

    - read the perldoc

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    28/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

    - use feature mtfnpy;

    -

    use 5.010;

    - read the perldoc Im a per ldocref!

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    29/184

    feature

    First: A Warning

    - 5.10 is backwards compatible

    - but adds new keywords and operators

    -theyre not enabled by default

    - use feature mtfnpy;

    -

    use 5.010;

    - read the perldoc

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    30/184

    say what

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    31/184

    perlfunc

    -

    new built-in, say

    - its like print

    - but it adds a newline for you

    say $what

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    32/184

    perlfunc

    say $what

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    33/184

    perlfunc

    say $what

    print Hello, world!\n;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    34/184

    perlfunc

    say $what

    print Hello, world!\n;

    print $message\n;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    35/184

    perlfunc

    say $what

    print Hello, world!\n;

    print $message\n;

    print $_\n for @lines;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    36/184

    perlfunc

    say $what

    print Hello, world!\n;

    print $message\n;

    print $_\n for @lines;

    say Hello, world!;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    37/184

    perlfunc

    say $what

    print Hello, world!\n;

    print $message\n;

    print $_\n for @lines;

    say Hello, world!;

    say $message;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    38/184

    perlfunc

    say $what

    print Hello, world!\n;

    print $message\n;

    print $_\n for @lines;

    say Hello, world!;

    say $message;

    say for @lines;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    39/184

    truth and definedness

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    40/184

    perlop

    truth and definedness

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    41/184

    perlop

    truth and definedness

    sub record_sale {

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    42/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    43/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount ||= $product->cost;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    44/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    45/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    46/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount = defined $amount? $amount: $product->cost;

    ...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    47/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    48/184

    perlop

    truth and definedness

    sub record_sale {my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    49/184

    perlop

    the new OR operator

    sub record_sale {my ($product, $amount) = @_;

    $amount //= $product->cost;

    ...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    50/184

    perlop

    the new OR operator

    $setting = defined $given? $given: $default;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    51/184

    perlop

    the new OR operator

    $setting = $given;unless (defined $setting) {$setting = $default;

    }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    52/184

    perlop

    the new OR operator

    $setting = $given || $default;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    53/184

    perlop

    the new OR operator

    $setting = $given // $default;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    54/184

    keeping state

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    55/184

    perlsub

    $lines_left = 100;

    sub read_line {die trial period expiredunless $lines_left-- > 0;

    ...}

    State Variables

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    56/184

    perlsub

    my $lines_left = 100;

    sub read_line {die trial period expiredunless $lines_left-- > 0;

    ...}

    State Variables

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    57/184

    perlsub

    {my $lines_left = 100;

    sub read_line {die trial period expiredunless $lines_left-- > 0;

    ...}}

    State Variables

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    58/184

    perlsub

    package Trial::Period;sub new {my ($class, $arg) = @_;my $guts = {lines_left => $arg->{lines},error_msg => $arg->{error},

    };return bless $guts => $class;

    }

    sub consume_line {my ($self) = @_;$self->{lines_left}--;

    }

    sub lines_left {my ($self) = @_;return $self->{lines_left};

    }

    sub assert_lines_left {my ($self) = @_;unless ($self->lines_left) {die $self->{error_msg};

    }}1;

    State Variables

    my $LINES = 100;my $ERROR = sorry, trial period over;my $TRIAL = Trial::Period->new({lines => $LINES,error => $ERROR,

    });

    sub read_line {$TRIAL->assert_lines_left;...

    }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    59/184

    perlsub

    {my $lines_left = 100;

    sub read_line {die trial period expiredunless $lines_left-- > 0;

    ...}}

    State Variables

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    60/184

    perlsub

    sub read_line {

    state $lines_left = 100;die trial period expiredunless $lines_left-- > 0;

    ...}

    State Variables

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    61/184

    -x stacking

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    62/184

    perlfunc

    if (-f $fileand -w $fileand -z $file

    ) {

    unlink $file;}

    Stackable File Tests

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    63/184

    perlfunc

    if (-f $file and -w _ and -z _

    ) {unlink $file;

    }

    Stackable File Tests

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    64/184

    perlfunc

    if (-f -w -z $file) {unlink $file;

    }

    Stackable File Tests

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    65/184

    smart matching

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    66/184

    perlsyn

    Smart Matching

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    67/184

    perlsyn

    Smart Matching

    - a new kind of comparison operator

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    68/184

    perlsyn

    Smart Matching

    - a new kind of comparison operator

    -its behavior depends on its inputs

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    69/184

    perlsyn

    Smart Matching

    - a new kind of comparison operator

    -its behavior depends on its inputs

    - if these two things match...

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    70/184

    perlsyn

    Smart Matching

    - a new kind of comparison operator

    -its behavior depends on its inputs

    - if these two things match...

    -

    hard to tell, easy to show...

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    71/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    72/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    73/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    74/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    75/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ %hash) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    76/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ %hash) { ... }elsif ($foo ~~ qr/re/) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    77/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ %hash) { ... }elsif ($foo ~~ qr/re/) { ... }

    elsif ($foo ~~ $bar) { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    78/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ %hash) { ... }elsif ($foo ~~ qr/re/) { ... }

    elsif ($foo ~~ $bar) { ... }else { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    79/184

    perlsyn

    Smart Matching

    given ($foo) {when (undef) { ... }when (@array) { ... }when ($code) { ... }when (%hash) { ... }when (qr/re/) { ... }

    when ($bar) { ... }default { ... }}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    80/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ @array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ %hash) { ... }elsif ($foo ~~ qr/re/) { ... }

    elsif ($foo ~~ $bar) { ... }else { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    81/184

    perlsyn

    Smart Matching

    if ($foo ~~ undef) { ... }elsif ($foo ~~ $array) { ... }elsif ($foo ~~ $code) { ... }elsif ($foo ~~ $hash) { ... }elsif ($foo ~~ qr/re/) { ... }

    elsif ($foo ~~ $bar) { ... }else { ... }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    82/184

    perlsyn

    Smart Matching

    my $test;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    83/184

    perlsyn

    Smart Matching

    given ($foo) {when (undef) { ... }when ($aref) { ... }when ($code) { ... }when ($href) { ... }when ($regex) { ... }

    when ($object) { ... }default { ... }}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    84/184

    perlsyn

    Smart Matching

    given ($foo) {when ($test_1) { ... }when ($test_2) { ... }when ($test_3) { ... }when ($test_4) { ... }when ($test_5) { ... }

    when ($test_6) { ... }default { ... }}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    85/184

    perlsyn

    Smart Matching

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    86/184

    perlsyn

    Smart Matching

    @want = @have->where($test)

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    87/184

    perlsyn

    Smart Matching

    @want = @have->where($test)

    @want = @have->where(sub{ })

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    88/184

    h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    89/184

    perlsyn

    Smart Matching

    @want = @have->where($test)

    @want = @have->where(sub{ })

    @want = @have->where(qr/.../sm)

    @want = @have->where([ 1,2,3 ])

    h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    90/184

    perlsyn

    Smart Matching

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    91/184

    S M h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    92/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    93/184

    S M h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    94/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    S M h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    95/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;

    S M h

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    96/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    97/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    98/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    99/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    100/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }if (ref $test eq CODE) {

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    101/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }if (ref $test eq CODE) {return grep { $test->($_) } @$array;

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    102/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }if (ref $test eq CODE) {return grep { $test->($_) } @$array;

    }

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    103/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }if (ref $test eq CODE) {return grep { $test->($_) } @$array;

    }

    die invalid test

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    104/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;

    if (ref $test eq ARRAY) {my %known = map {$_=>1} @$test;

    return grep { $known{$_} } @$array;}if (ref $test eq Regexp) {return grep { $_ =~ $test } @$array;

    }if (ref $test eq CODE) {return grep { $test->($_) } @$array;

    }

    die invalid test}

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    105/184

    perlsyn

    Smart Matching

    sub where {my ($array, $test) = @_;grep { $_ ~~ $test } @$array;

    }

    S M hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    106/184

    perlsyn

    Smart Matching

    SmartMatch::Sugar

    S t M t hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    107/184

    perlsyn

    Smart Matching

    @want = @have->where( hash )

    SmartMatch::Sugar

    S t M t hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    108/184

    perlsyn

    Smart Matching

    @want = @have->where( hash )

    @want = @have->where( class )

    SmartMatch::Sugar

    S t M t hi

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    109/184

    perlsyn

    Smart Matching

    @want = @have->where( hash )

    @want = @have->where( class )

    @want = @have->where(isa(Foo))

    SmartMatch::Sugar

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    110/184

    unknown undefined

    B tt E M ( )

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    111/184

    perldiag

    $str = Greetings, $name. Your lastlogin was $last. It is now $time.;

    Better Error Message(s)

    B tt E M ( )

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    112/184

    perldiag

    $str = Greetings, $name. Your lastlogin was $last. It is now $time.;

    Better Error Message(s)

    Use of uninitialized value in

    concatenation (.) or string athello.plx line 9.

    B tt E M g ( )

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    113/184

    perldiag

    Better Error Message(s)

    Use of uninitialized value $time in

    concatenation (.) or string athello.plx line 9.

    $str = Greetings, $name. Your lastlogin was $last. It is now $time.;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    114/184

    inside-out objects

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    115/184

    Hash::Util::FieldHash

    Inside-Out Objects

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    116/184

    Hash::Util::FieldHash

    Inside-Out Objects

    - traditional objects are a hashref

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    117/184

    Hash::Util::FieldHash

    Inside-Out Objects

    - traditional objects are a hashref

    -

    look up attrs in the obj itself by attr name

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    118/184

    Hash::Util::FieldHash

    Inside-Out Objects

    - traditional objects are a hashref

    -

    look up attrs in the obj itself by attr name- inside-out objects are content-free refs

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    119/184

    Hash::Util::FieldHash

    Inside-Out Objects

    - traditional objects are a hashref

    -

    look up attrs in the obj itself by attr name- inside-out objects are content-free refs

    - look up attrs in an external hash by obj id

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    120/184

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    121/184

    Hash::Util::FieldHash

    Inside-Out Objects

    sub size {my $self = shift;

    if (@_) {return $self->{size} = shift;

    } else {return $self->{size};

    }}

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    122/184

    Hash::Util::FieldHash

    Inside-Out Objects

    my %size;sub size {

    my $self = shift;

    if (@_) {return $size{ $self } = shift;

    } else {

    return $size{ $self };}}

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    123/184

    Hash::Util::FieldHash

    Inside-Out Objects

    my %size;sub size {my $self = shift;my $id = refaddr $self;

    if (@_) {return $size{ $id } = shift;

    } else {

    return $size{ $id };}

    }

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    124/184

    Inside Out Objects

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    125/184

    Hash::Util::FieldHash

    Inside-Out Objectsmy %size;sub size {my $self = shift;my $id = refaddr $self;

    if (@_) {return $size{ $id } = shift;

    } else {return $size{ $id };

    }}

    sub DESTROY {my $id = refaddr $_[0];delete $size{ $id };

    }

    sub CLONE {my $class = shift;

    my @properties = map { values %$_ }values %PROP_DATA_FOR;

    for my $old_id ( keys %OBJ ) {

    my $object = $OBJ{ $old_id };my $new_id = refaddr $object;

    for my $prop ( @properties ) {next unless exists $prop->{ $old };$prop->{ $new } = $prop->{ $old };delete $prop->{ $old };

    }

    weaken ( $OBJ{ $new } = $object );delete $OBJ{ $old };

    }}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    126/184

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    127/184

    Hash::Util::FieldHash

    Field Hashes

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    128/184

    Hash::Util::FieldHash

    Field Hashes

    - theyre just like hashes

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    129/184

    Hash::Util::FieldHash

    Field Hashes

    - theyre just like hashes

    - objects as keys become object ids

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    130/184

    Hash::Util::FieldHash

    Field Hashes

    - theyre just like hashes

    - objects as keys become object ids

    - but get destroyed and cloned

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    131/184

    Hash::Util::FieldHash

    Field Hashes

    my %size;sub size {

    my $self = shift;

    if (@_) {return $size{ $self } = shift;

    } else {

    return $size{ $self };}}

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    132/184

    Hash::Util::FieldHash

    Field Hashes

    fieldhash my %size;sub size {

    my $self = shift;

    if (@_) {return $size{ $self } = shift;

    } else {

    return $size{ $self };}}

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    133/184

    Hash::Util::FieldHash

    Field Hashes

    {fieldhash my %size;sub size {my $self = shift;if (@_) {return $size{ $self } = shift;} else {return $size{ $self };

    }}

    }

    Field Hashes

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    134/184

    Hash::Util::FieldHash

    Field Hashes

    sub size {my $self = shift;fieldhash state %size;

    if (@_) {return $size{ $self } = shift;

    } else {

    return $size{ $self };}}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    135/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    136/184

    Lexical Topic

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    137/184

    perlvar

    for (@lines) {chomp;

    next if /^#/;next unless length;s/a/b/;sanity_check;

    say;}

    Lexical Topic

    Lexical Topic

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    138/184

    perlvar

    Lexical Topic

    for my $line (@lines) {chomp $line;

    next if $line ~~ /^#/;next unless length $line;$line =~ s/a/b/;sanity_check($line);

    say $line;}

    Lexical Topic

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    139/184

    perlvar

    for my $_ (@lines) {chomp;

    next if /^#/;next unless length;s/a/b/;sanity_check;

    say;}

    Lexical Topic

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    140/184

    Regex

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    141/184

    named captures

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    142/184

    perlre

    Regex: Named Captures

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    143/184

    perlre

    Regex: Named Captures

    - find matches by name, not position

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    144/184

    perlre

    Regex: Named Captures

    - find matches by name, not position

    - avoid the dreaded $1

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    145/184

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    146/184

    perlre

    # our hypothetical format

    section:property = value

    Regex: Named Captures

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    147/184

    perlre

    $line ~~ /(\w+):(\w+) = (\w+)/;$name = $2;$value = $3;

    Regex: Named Captures

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    148/184

    perlre

    $lhs_re = qr/(\w+):(\w+)/;$rhs_re = qr/(\w+)/;

    $line ~~ /$lhs_re = $rhs_re/;

    $name = $2;

    $value = $3;

    Regex: Named Captures

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    149/184

    perlre

    $line ~~ /$lhs_re = $rhs_re/;$name = $2;$value = $3;

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    150/184

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    151/184

    perlre

    $lhs_re = qr/(\w+):(\w+)/;$rhs_re = qr/(\w+)/;

    g p

    Regex: Named Captures

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    152/184

    perlre

    $lhs_re = qr/(\w+):(?\w+)/;$rhs_re = qr/(?\w+)/;

    g p

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    153/184

    better backrefs

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    154/184

    perlre

    g

    m{< (\w+) > .+ < /\1 > }x

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    155/184

    perlre

    g

    m{< (\w+) > .+ < /\1 > }x

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    156/184

    perlre

    g

    \10

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    157/184

    perlre

    g

    qr{(\d)\10}

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    158/184

    perlre

    g

    qr{ (\d) \1 0}x

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    159/184

    perlre

    g

    m{< (\w+) > .+ < /\1 > }x

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    160/184

    perlre

    g

    m{< (\w+) > .+ < /\g{1} > }x

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    161/184

    perlre

    g

    \10

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    162/184

    perlre

    g

    \g{10}

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    163/184

    perlre

    g

    qr{(\d)\10}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    164/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    165/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    166/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    167/184

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    168/184

    perlop

    if ($str =~ $wtf_re) {...}

    Regex: Backreference

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    169/184

    perlop

    if ($str ~~ $wtf_re) {...}

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    170/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    171/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    172/184

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    173/184

    p rlr pi

    -

    lets you change how regex work

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    174/184

    p l pi

    -

    lets you change how regex work

    - but not how you use them (=~, s///, etc)

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    175/184

    gi POSIX

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    176/184

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    177/184

    re::engine::POSIX

    my $regex = qr{ ... };

    my @files = $find->file->in( $root );

    say for grep { slurp ~~ $re } @files;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    178/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    179/184

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    180/184

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    181/184

    re::engine::POSIX

    use re::engine::POSIX;

    my $regex = qr{ ... };

    my @files = $find->file->in( $root );

    say for grep { slurp ~~ $re } @files;

    Alternate Regex Engines

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    182/184

    re::engine::POSIX

    use re::engine::POSIX;

    my $regex = qr{ ... }x;

    my @files = $find->file->in( $root );

    say for grep { slurp ~~ $re } @files;

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    183/184

    http://www.perl.org/get.html

  • 8/8/2019 Perl 510 for People Who Arent Totally Insane 4609

    184/184