SlideShare a Scribd company logo
1 of 184
Download to read offline
Perl 5.10
for people who are not insane
Perl 5.10
for people who are not totally insane
5.10 isn’t like 5.8.x




                    perl5100delta
5.10 isn’t like 5.8.x


- features only get added in new 5.x releases



                                          perl5100delta
5.10 isn’t like 5.8.x


- features only get added in new 5.x releases
- it’s been 5 years since the last release (5.8)


                                            perl5100delta
5.10 is Way Cool




                   perl51000delta
5.10 is Way Cool

- no significant new features in Perl since 2002




                                        perl51000delta
5.10 is Way Cool

- no significant new features in Perl since 2002
- remember how bad you wanted to see Star
  Wars: Episode 1?




                                        perl51000delta
5.10 is Way Cool

- no significant new features in Perl since 2002
- remember how bad you wanted to see Star
  Wars: Episode 1?
- that’s how excited you should be for 5.10


                                        perl51000delta
5.10 is Way Cool

- no significant new features in Perl since 2002
- remember how bad you wanted to see Star
  Wars: Episode 1?
- that’s how excited you should be for 5.10
- but it won’t suck (no POD race scene)

                                        perl51000delta
Lexicascopasmartwhat?




                  perl51000delta
Lexicascopasmartwhat?

- lexically scoped user pragmata!




                                    perl51000delta
Lexicascopasmartwhat?

- lexically scoped user pragmata!
- pluggable regex compilation engines!



                                         perl51000delta
Lexicascopasmartwhat?

- lexically scoped user pragmata!
- pluggable regex compilation engines!
- trie-based non-recursive pattern matching!


                                        perl51000delta
Lexicascopasmartwhat?

- lexically scoped user pragmata!
- pluggable regex compilation engines!
- trie-based non-recursive pattern matching!
- thread-safe weak refkey hashes!

                                        perl51000delta
Yes, You Care




                perl51000delta
Yes, You Care

- Not everything in 5.10 is esoteric.




                                        perl51000delta
Yes, You Care

- Not everything in 5.10 is esoteric.
- Not everything in 5.10 is for gurus.



                                         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.


                                       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.

                                       perl51000delta
First: A Warning




                   feature
First: A Warning
- 5.10 is backwards compatible




                                 feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators




                                        feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default



                                        feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default
-   use feature ‘mtfnpy’;




                                        feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default
-   use feature ‘mtfnpy’;

-   use 5.010;




                                        feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default
-   use feature ‘mtfnpy’;

-   use 5.010;

- read the perldoc
                                        feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default
-   use feature ‘mtfnpy’;

-   use 5.010;

- read the perldoc                I’m a perldoc
                                       ref!
                                              feature
First: A Warning
- 5.10 is backwards compatible
- but adds new keywords and operators
- they’re not enabled by default
-   use feature ‘mtfnpy’;

-   use 5.010;

- read the perldoc
                                        feature
say what
say $what


- new built-in, say
- it’s like print
- but it adds a newline for you

                                  perlfunc
say $what




            perlfunc
say $what

print “Hello, world!n”;




                           perlfunc
say $what

print “Hello, world!n”;


print “$messagen”;




                           perlfunc
say $what

print “Hello, world!n”;


print “$messagen”;


print “$_n” for @lines;


                           perlfunc
say $what

print “Hello, world!n”;
say “Hello, world!”;
print “$messagen”;


print “$_n” for @lines;


                           perlfunc
say $what

print “Hello, world!n”;
say “Hello, world!”;
print “$messagen”;
say $message;
print “$_n” for @lines;


                           perlfunc
say $what

print “Hello, world!n”;
say “Hello, world!”;
print “$messagen”;
say $message;
print “$_n” for @lines;
say for @lines;

                           perlfunc
truth and definedness
truth and definedness




                        perlop
truth and definedness
sub record_sale {




                          perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;




                             perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

  $amount ||= $product->cost;




                                perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

  $amount ||= $product->cost;

  ...



                                perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...
}


                                  perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

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

    ...
}

                                perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...
}


                                  perlop
truth and definedness
sub record_sale {
  my ($product, $amount) = @_;

    $amount ||= $product->cost;

    ...
}


                                  perlop
the new OR operator
sub record_sale {
  my ($product, $amount) = @_;

    $amount //= $product->cost;

    ...
}


                                  perlop
the new OR operator


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




                            perlop
the new OR operator

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




                              perlop
the new OR operator


$setting = $given || $default;




                             perlop
the new OR operator


$setting = $given // $default;




                             perlop
keeping state
State Variables
$lines_left = 100;

sub read_line {
  die “trial period expired”
    unless $lines_left-- > 0;
  ...
}


                                perlsub
State Variables
my $lines_left = 100;

sub read_line {
  die “trial period expired”
    unless $lines_left-- > 0;
  ...
}


                                perlsub
State Variables
{
    my $lines_left = 100;

    sub read_line {
      die “trial period expired”
       unless $lines_left-- > 0;
      ...
    }
}

                               perlsub
State Variables
package Trial::Period;
sub new {
  my ($class, $arg) = @_;
  my $guts = {
    lines_left => $arg->{lines},
    error_msg => $arg->{error},
  };
  return bless $guts => $class;
}                                  my $LINES = 100;
                                   my $ERROR = “sorry, trial period over”;
sub consume_line {                 my $TRIAL = Trial::Period->new({
  my ($self) = @_;                   lines => $LINES,
  $self->{lines_left}--;             error => $ERROR,
}                                  });

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

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




                                                                             perlsub
State Variables
{
    my $lines_left = 100;

    sub read_line {
      die “trial period expired”
       unless $lines_left-- > 0;
      ...
    }
}

                               perlsub
State Variables

sub read_line {
  state $lines_left = 100;
  die “trial period expired”
    unless $lines_left-- > 0;
  ...
}


                                perlsub
-x stacking
Stackable File Tests
if (
  -f $file
  and -w $file
  and -z $file
) {
  unlink $file;
}


                          perlfunc
Stackable File Tests

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



                               perlfunc
Stackable File Tests


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




                          perlfunc
smart matching
Smart Matching




                 perlsyn
Smart Matching

- a new kind of comparison operator




                                      perlsyn
Smart Matching

- a new kind of comparison operator
- its behavior depends on its inputs



                                       perlsyn
Smart Matching

- a new kind of comparison operator
- its behavior depends on its inputs
- “if these two things match...”


                                       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...

                                       perlsyn
Smart Matching




                 perlsyn
Smart Matching
if ($foo ~~ undef)   { ... }




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




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




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




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




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



                                         perlsyn
Smart Matching
   if   ($foo   ~~   undef)    {   ...   }
elsif   ($foo   ~~   @array)   {   ...   }
elsif   ($foo   ~~   $code)    {   ...   }
elsif   ($foo   ~~   %hash)    {   ...   }
elsif   ($foo   ~~   qr/re/)   {   ...   }
elsif   ($foo   ~~   $bar)     {   ...   }
else                           {   ...   }


                                         perlsyn
Smart Matching
given ($foo) {
  when (undef)    {   ...   }
  when (@array)   {   ...   }
  when ($code)    {   ...   }
  when (%hash)    {   ...   }
  when (qr/re/)   {   ...   }
  when ($bar)     {   ...   }
  default         {   ...   }
}

                                perlsyn
Smart Matching
   if   ($foo   ~~   undef)    {   ...   }
elsif   ($foo   ~~   @array)   {   ...   }
elsif   ($foo   ~~   $code)    {   ...   }
elsif   ($foo   ~~   %hash)    {   ...   }
elsif   ($foo   ~~   qr/re/)   {   ...   }
elsif   ($foo   ~~   $bar)     {   ...   }
else                           {   ...   }


                                         perlsyn
Smart Matching
   if   ($foo   ~~   undef)    {   ...   }
elsif   ($foo   ~~   $array)   {   ...   }
elsif   ($foo   ~~   $code)    {   ...   }
elsif   ($foo   ~~   $hash)    {   ...   }
elsif   ($foo   ~~   qr/re/)   {   ...   }
elsif   ($foo   ~~   $bar)     {   ...   }
else                           {   ...   }


                                         perlsyn
Smart Matching



my $test;

                 perlsyn
Smart Matching
given ($foo) {
  when (undef)     {   ...   }
  when ($aref)     {   ...   }
  when ($code)     {   ...   }
  when ($href)     {   ...   }
  when ($regex)    {   ...   }
  when ($object)   {   ...   }
  default          {   ...   }
}

                                 perlsyn
Smart Matching
given ($foo) {
  when ($test_1)   {   ...   }
  when ($test_2)   {   ...   }
  when ($test_3)   {   ...   }
  when ($test_4)   {   ...   }
  when ($test_5)   {   ...   }
  when ($test_6)   {   ...   }
  default          {   ...   }
}

                                 perlsyn
Smart Matching




                 perlsyn
Smart Matching

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




                              perlsyn
Smart Matching

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

@want = @have->where(sub{ 

 })




                               perlsyn
Smart Matching

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

@want = @have->where(sub{ 

 })

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




                               perlsyn
Smart Matching

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

@want = @have->where(sub{ 

 })

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

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


                               perlsyn
Smart Matching




                 perlsyn
Smart Matching
sub where {




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




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

 if (ref $test eq ‘ARRAY’)   {




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

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




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

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




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

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




                                         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’) {




                                           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;




                                            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;
 }




                                            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’) {




                                            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;




                                            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;
 }




                                            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”




                                            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”
}


                                               perlsyn
Smart Matching


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




                                  perlsyn
Smart Matching
  SmartMatch::Sugar




                      perlsyn
Smart Matching
      SmartMatch::Sugar

@want = @have->where( hash )




                               perlsyn
Smart Matching
       SmartMatch::Sugar

@want = @have->where( hash )

@want = @have->where( class )




                                perlsyn
Smart Matching
        SmartMatch::Sugar

 @want = @have->where( hash )

 @want = @have->where( class )

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




                                 perlsyn
unknown undefined
Better Error Message(s)

$str = “Greetings, $name. Your last
login was $last. It is now $time.”;




                                 perldiag
Better Error Message(s)

$str = “Greetings, $name. Your last
login was $last. It is now $time.”;




Use of uninitialized value in
concatenation (.) or string at
hello.plx line 9.


                                 perldiag
Better Error Message(s)

$str = “Greetings, $name. Your last
login was $last. It is now $time.”;




Use of uninitialized value $time in
concatenation (.) or string at
hello.plx line 9.


                                  perldiag
inside-out objects
Inside-Out Objects




              Hash::Util::FieldHash
Inside-Out Objects
- traditional objects are a hashref




                                      Hash::Util::FieldHash
Inside-Out Objects
- traditional objects are a hashref
  - look up attrs in the obj itself by attr name




                                   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



                                   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

                                   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
- there are complications for inside-out objects
                                   Hash::Util::FieldHash
Inside-Out Objects
sub size {
  my $self = shift;

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


                          Hash::Util::FieldHash
Inside-Out Objects
my %size;
sub size {
  my $self = shift;

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

                          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 };
    }
}

                            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 };
    }
}

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



                                     Hash::Util::FieldHash
Inside-Out Objects
my %size;                            sub CLONE {
sub size {                             my $class = shift;
  my $self = shift;
  my $id   = refaddr $self;            my @properties = map { values %$_ }
                                     values %PROP_DATA_FOR;
    if (@_) {
      return $size{ $id } = shift;       for my $old_id ( keys %OBJ ) {
    } else {
      return $size{ $id };                   my $object = $OBJ{ $old_id };
    }                                        my $new_id = refaddr $object;
}
                                             for my $prop ( @properties ) {
sub DESTROY {                                  next unless exists $prop->{ $old };
  my $id = refaddr $_[0];                      $prop->{ $new } = $prop->{ $old };
  delete $size{ $id };                         delete $prop->{ $old };
}                                            }

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




                                                            Hash::Util::FieldHash
Inside-Out Objects
my %OBJECT_REGISTRY;                   sub CLONE {
my %size;                                my $class = shift;
sub size {
  my $self = shift;                      my @properties = map { values %$_ }
  my $id   = refaddr $self;            values %PROP_DATA_FOR;

    $self->register_object;                for my $old_id ( keys %OBJECT_REGISTRY )
                                       {
    if (@_) {
      return $size{ $self } = shift;       my $object =
    } else {                           $OBJECT_REGISTRY{ $old_id };
      return $size{ $self };               my $new_id = refaddr $object;
    }
}                                          for my $prop ( @properties ) {
                                             next unless exists $prop-
sub DESTROY {                          >{ $old_id };
  my $id = refaddr $_[0];                    $prop->{ $new_id } = $prop-
  delete $size{ $id };                 >{ $old_id };
  delete $OBJECT_REGISTRY{ $id };            delete $prop->{ $old_id };
}                                          }

sub register_object {                      weaken ( $OBJECT_REGISTRY{ $new_id } =
  my ($self) = @_;                     $object );
  my $id = refaddr $self;                  delete $OBJECT_REGISTRY{ $old_id };
  $OBJECT_REGISTRY{ $id } = $self;       }
}                                      }




                                                            Hash::Util::FieldHash
Field Hashes




           Hash::Util::FieldHash
Field Hashes

- they’re just like hashes




                             Hash::Util::FieldHash
Field Hashes

- they’re just like hashes
- objects as keys become object ids



                                  Hash::Util::FieldHash
Field Hashes

- they’re just like hashes
- objects as keys become object ids
- but get destroyed and cloned

                                  Hash::Util::FieldHash
Field Hashes
my %size;
sub size {
  my $self = shift;

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

                          Hash::Util::FieldHash
Field Hashes
fieldhash my %size;
sub size {
  my $self = shift;

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

                          Hash::Util::FieldHash
Field Hashes
{
    fieldhash my %size;
    sub size {
      my $self = shift;
      if (@_) {
        return $size{ $self } = shift;
      } else {
        return $size{ $self };
      }
    }
}

                              Hash::Util::FieldHash
Field Hashes
sub size {
  my $self = shift;
  fieldhash state %size;

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

                           Hash::Util::FieldHash
lexical topic
(topic is how you say $_)
Lexical Topic
for (@lines) {
  chomp;
  next if /^#/;
  next unless length;
  s/a/b/;
  sanity_check;
  say;
}

                        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;
}

                              perlvar
Lexical Topic
for my $_ (@lines) {
  chomp;
  next if /^#/;
  next unless length;
  s/a/b/;
  sanity_check;
  say;
}

                        perlvar
Regex
named captures
Regex: Named Captures




                        perlre
Regex: Named Captures

- find matches by name, not position




                                       perlre
Regex: Named Captures

- find matches by name, not position
- avoid the dreaded$1




                                       perlre
Regex: Named Captures

- find matches by name, not position
- avoid the dreaded $1


- no longer second to Python or .Net!

                                        perlre
Regex: Named Captures


# our hypothetical format

section:property = value




                            perlre
Regex: Named Captures

$line ~~ /(w+):(w+) = (w+)/;

$name = $2;
$value = $3;




                                  perlre
Regex: Named Captures

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

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

$name = $2;
$value = $3;



                                perlre
Regex: Named Captures

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

$name = $2;
$value = $3;




                                perlre
Regex: Named Captures

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

$name = $+{ name };
$value = $+{ value };




                                perlre
Regex: Named Captures


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




                             perlre
Regex: Named Captures


$lhs_re = qr/(w+):(?<name>w+)/;
$rhs_re = qr/(?<value>w+)/;




                                    perlre
better backrefs
Regex: Backreference


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




                             perlre
Regex: Backreference


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




                             perlre
Regex: Backreference



      10
                       perlre
Regex: Backreference


  qr{(d)10}


                       perlre
Regex: Backreference


qr{ (d) 1 0}x


                       perlre
Regex: Backreference


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




                             perlre
Regex: Backreference


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




                               perlre
Regex: Backreference



      10
                       perlre
Regex: Backreference



   g{10}
                       perlre
Regex: Backreference


  qr{(d)10}


                       perlre
Regex: Backreference


qr{(d)g{1}0}


                       perlre
Regex: Backreference


qr{(d)g{-1}0}


                       perlre
Regex: Backreference
qr{
   (?<digit>d)
   g{digit}
   0
}x
                       perlre
Regex: Exit Strategy
my $wtf_re = qr{
xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^x80-xf
fn015()]*)*)[040t]*)*(?:(?:[^(040)<>@,;:”.[]000-037x80-x
ff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|”[^x80-xffn015
“]*(?:[^x80-xff][^x80-xffn015”]*)*”)[040t]*(?:([^x80-
xffn015()]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^x80
-xff][^x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040t]*
)*(?:.[040t]*(?:([^x80-xffn015()]*(?:(?:[^x80-xff]|([^
x80-xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^
x80-xffn015()]*)*)[040t]*)*(?:[^(040)<>@,;:”.[]000-037x8
0-xff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|”[^x80-xffn
015”]*(?:[^x80-xff][^x80-xffn015”]*)*”)[040t]*(?:([^x
80-xffn015()]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^
x80-xff][^x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040
t]*)*)*@[040t]*(?:([^x80-xffn015()]*(?:(?:[^x80-xff]|([
^x80-xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^
x80-xffn015()]*)*)[040t]*)*(?:[^(040)<>@,;:”.[]000-037
x80-xff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|[(?:[^x80-
xffn015[]]|[^x80-xff])*])[040t]*(?:([^x80-xffn015()
]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^x80-xff][^
x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040t]*)*(?:.[04
};




                                                                         wtf
Regex: Backreference


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



                       perlop
Regex: Backreference


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



                       perlop
lexically scoped alternate
trie-based reentrant user-
 defined regex pragmata
flexible regex
Alternate Regex Engines




                      perlreapi
Alternate Regex Engines


- lets you change how regex work



                                   perlreapi
Alternate Regex Engines


- lets you change how regex work
- but not how you use them ( ,
                            =~ s///, etc)




                                            perlreapi
Alternate Regex Engines




                  re::engine::POSIX
Alternate Regex Engines


egrep -r -l PATTERN DIR




                          re::engine::POSIX
Alternate Regex Engines

my $regex = qr{ ... };

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

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




                                 re::engine::POSIX
Alternate Regex Engines




                  re::engine::POSIX
Alternate Regex Engines


egrep -r -l ‘.+?’ DIR




                        re::engine::POSIX
Alternate Regex Engines

my $regex = qr{ ... };

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

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




                                 re::engine::POSIX
Alternate Regex Engines

use re::engine::POSIX;

my $regex = qr{ ... };

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

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




                                 re::engine::POSIX
Alternate Regex Engines

use re::engine::POSIX;

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

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

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




                                 re::engine::POSIX
http://www.perl.org/get.html
Any questions?

More Related Content

What's hot

PHP 8.1 - What's new and changed
PHP 8.1 - What's new and changedPHP 8.1 - What's new and changed
PHP 8.1 - What's new and changedAyesh Karunaratne
 
MySQL Operators
MySQL OperatorsMySQL Operators
MySQL Operatorsmysql content
 
C# conventions & good practices
C# conventions & good practicesC# conventions & good practices
C# conventions & good practicesTan Tran
 
OCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building BlocksOCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building BlocksÄ°brahim KĂŒrce
 
Parboiled explained
Parboiled explainedParboiled explained
Parboiled explainedPaul Popoff
 
Regular Expressions Cheat Sheet
Regular Expressions Cheat SheetRegular Expressions Cheat Sheet
Regular Expressions Cheat SheetAkash Bisariya
 
OCP Java (OCPJP) 8 Exam Quick Reference Card
OCP Java (OCPJP) 8 Exam Quick Reference CardOCP Java (OCPJP) 8 Exam Quick Reference Card
OCP Java (OCPJP) 8 Exam Quick Reference CardHari kiran G
 
OCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIsOCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIsÄ°brahim KĂŒrce
 
Clean code: meaningful Name
Clean code: meaningful NameClean code: meaningful Name
Clean code: meaningful Namenahid035
 
5. Destructuring | ES6 | Assignment
5. Destructuring | ES6 | Assignment 5. Destructuring | ES6 | Assignment
5. Destructuring | ES6 | Assignment pcnmtutorials
 
Perl tutorial
Perl tutorialPerl tutorial
Perl tutorialManav Prasad
 
Cracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsCracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsGanesh Samarthyam
 
Clean code
Clean codeClean code
Clean codeifnu bima
 
Monad Laws Must be Checked
Monad Laws Must be CheckedMonad Laws Must be Checked
Monad Laws Must be CheckedPhilip Schwarz
 
Spring annotations notes
Spring annotations notesSpring annotations notes
Spring annotations notesVipul Singh
 
Perl Introduction
Perl IntroductionPerl Introduction
Perl IntroductionMarcos Rebelo
 
4. Classes and Methods
4. Classes and Methods4. Classes and Methods
4. Classes and MethodsNilesh Dalvi
 
C# coding standards, good programming principles & refactoring
C# coding standards, good programming principles & refactoringC# coding standards, good programming principles & refactoring
C# coding standards, good programming principles & refactoringEyob Lube
 

What's hot (20)

Data Types In PHP
Data Types In PHPData Types In PHP
Data Types In PHP
 
PHP 8.1 - What's new and changed
PHP 8.1 - What's new and changedPHP 8.1 - What's new and changed
PHP 8.1 - What's new and changed
 
MySQL Operators
MySQL OperatorsMySQL Operators
MySQL Operators
 
Php Basico
Php BasicoPhp Basico
Php Basico
 
C# conventions & good practices
C# conventions & good practicesC# conventions & good practices
C# conventions & good practices
 
OCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building BlocksOCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building Blocks
 
Parboiled explained
Parboiled explainedParboiled explained
Parboiled explained
 
Regular Expressions Cheat Sheet
Regular Expressions Cheat SheetRegular Expressions Cheat Sheet
Regular Expressions Cheat Sheet
 
OCP Java (OCPJP) 8 Exam Quick Reference Card
OCP Java (OCPJP) 8 Exam Quick Reference CardOCP Java (OCPJP) 8 Exam Quick Reference Card
OCP Java (OCPJP) 8 Exam Quick Reference Card
 
OCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIsOCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIs
 
Clean code: meaningful Name
Clean code: meaningful NameClean code: meaningful Name
Clean code: meaningful Name
 
5. Destructuring | ES6 | Assignment
5. Destructuring | ES6 | Assignment 5. Destructuring | ES6 | Assignment
5. Destructuring | ES6 | Assignment
 
Perl tutorial
Perl tutorialPerl tutorial
Perl tutorial
 
Cracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsCracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 Exams
 
Clean code
Clean codeClean code
Clean code
 
Monad Laws Must be Checked
Monad Laws Must be CheckedMonad Laws Must be Checked
Monad Laws Must be Checked
 
Spring annotations notes
Spring annotations notesSpring annotations notes
Spring annotations notes
 
Perl Introduction
Perl IntroductionPerl Introduction
Perl Introduction
 
4. Classes and Methods
4. Classes and Methods4. Classes and Methods
4. Classes and Methods
 
C# coding standards, good programming principles & refactoring
C# coding standards, good programming principles & refactoringC# coding standards, good programming principles & refactoring
C# coding standards, good programming principles & refactoring
 

Viewers also liked

Asynchronous programming with AnyEvent
Asynchronous programming with AnyEventAsynchronous programming with AnyEvent
Asynchronous programming with AnyEventTatsuhiko Miyagawa
 
New Zealand
New ZealandNew Zealand
New ZealandSchool
 
The Seven Deadly Sins of Bioinformatics
The Seven Deadly Sins of BioinformaticsThe Seven Deadly Sins of Bioinformatics
The Seven Deadly Sins of BioinformaticsDuncan Hull
 
KohaCon11: Integrating Koha with RFID system
KohaCon11: Integrating Koha with RFID systemKohaCon11: Integrating Koha with RFID system
KohaCon11: Integrating Koha with RFID systemDobrica Pavlinuơić
 
Let's hack cheap hardware 2016 edition
Let's hack cheap hardware 2016 editionLet's hack cheap hardware 2016 edition
Let's hack cheap hardware 2016 editionDobrica Pavlinuơić
 
What's new in Perl 5.10?
What's new in Perl 5.10?What's new in Perl 5.10?
What's new in Perl 5.10?acme
 

Viewers also liked (6)

Asynchronous programming with AnyEvent
Asynchronous programming with AnyEventAsynchronous programming with AnyEvent
Asynchronous programming with AnyEvent
 
New Zealand
New ZealandNew Zealand
New Zealand
 
The Seven Deadly Sins of Bioinformatics
The Seven Deadly Sins of BioinformaticsThe Seven Deadly Sins of Bioinformatics
The Seven Deadly Sins of Bioinformatics
 
KohaCon11: Integrating Koha with RFID system
KohaCon11: Integrating Koha with RFID systemKohaCon11: Integrating Koha with RFID system
KohaCon11: Integrating Koha with RFID system
 
Let's hack cheap hardware 2016 edition
Let's hack cheap hardware 2016 editionLet's hack cheap hardware 2016 edition
Let's hack cheap hardware 2016 edition
 
What's new in Perl 5.10?
What's new in Perl 5.10?What's new in Perl 5.10?
What's new in Perl 5.10?
 

Similar to Perl 5.10 for People Who Aren't Totally Insane

What's New in Perl? v5.10 - v5.16
What's New in Perl?  v5.10 - v5.16What's New in Perl?  v5.10 - v5.16
What's New in Perl? v5.10 - v5.16Ricardo Signes
 
Writing Maintainable Perl
Writing Maintainable PerlWriting Maintainable Perl
Writing Maintainable Perltinypigdotcom
 
Perl 5.14 for Pragmatists
Perl 5.14 for PragmatistsPerl 5.14 for Pragmatists
Perl 5.14 for PragmatistsRicardo Signes
 
Perl Sucks - and what to do about it
Perl Sucks - and what to do about itPerl Sucks - and what to do about it
Perl Sucks - and what to do about it2shortplanks
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl styleBo Hua Yang
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In PerlKang-min Liu
 
Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl TechniquesDave Cross
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.Workhorse Computing
 
I, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 OverlordsI, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 Overlordsheumann
 
Functional Pearls 4 (YAPC::EU::2009 remix)
Functional Pearls 4 (YAPC::EU::2009 remix)Functional Pearls 4 (YAPC::EU::2009 remix)
Functional Pearls 4 (YAPC::EU::2009 remix)osfameron
 
Introduction to Modern Perl
Introduction to Modern PerlIntroduction to Modern Perl
Introduction to Modern PerlDave Cross
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.VimLin Yo-An
 
Cleancode
CleancodeCleancode
Cleancodehendrikvb
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perldaoswald
 
Dealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottDealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottO'Reilly Media
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinosbrian d foy
 

Similar to Perl 5.10 for People Who Aren't Totally Insane (20)

What's New in Perl? v5.10 - v5.16
What's New in Perl?  v5.10 - v5.16What's New in Perl?  v5.10 - v5.16
What's New in Perl? v5.10 - v5.16
 
Writing Maintainable Perl
Writing Maintainable PerlWriting Maintainable Perl
Writing Maintainable Perl
 
Perl 5.14 for Pragmatists
Perl 5.14 for PragmatistsPerl 5.14 for Pragmatists
Perl 5.14 for Pragmatists
 
Perl Sucks - and what to do about it
Perl Sucks - and what to do about itPerl Sucks - and what to do about it
Perl Sucks - and what to do about it
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl style
 
Php Basic
Php BasicPhp Basic
Php Basic
 
Basic PHP
Basic PHPBasic PHP
Basic PHP
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl Techniques
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
 
I, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 OverlordsI, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 Overlords
 
Unit Testing Lots of Perl
Unit Testing Lots of PerlUnit Testing Lots of Perl
Unit Testing Lots of Perl
 
Functional Pearls 4 (YAPC::EU::2009 remix)
Functional Pearls 4 (YAPC::EU::2009 remix)Functional Pearls 4 (YAPC::EU::2009 remix)
Functional Pearls 4 (YAPC::EU::2009 remix)
 
Introduction to Modern Perl
Introduction to Modern PerlIntroduction to Modern Perl
Introduction to Modern Perl
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Cleancode
CleancodeCleancode
Cleancode
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perl
 
Dealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottDealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter Scott
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinos
 

More from Ricardo Signes

Perl 5: Today, Tomorrow, and Christmas
Perl 5: Today, Tomorrow, and ChristmasPerl 5: Today, Tomorrow, and Christmas
Perl 5: Today, Tomorrow, and ChristmasRicardo Signes
 
Dist::Zilla - Maximum Overkill for CPAN Distributions
Dist::Zilla - Maximum Overkill for CPAN DistributionsDist::Zilla - Maximum Overkill for CPAN Distributions
Dist::Zilla - Maximum Overkill for CPAN DistributionsRicardo Signes
 
Perl 5.12 for Everyday Use
Perl 5.12 for Everyday UsePerl 5.12 for Everyday Use
Perl 5.12 for Everyday UseRicardo Signes
 
Antediluvian Unix: A Guide to Unix Fundamentals
Antediluvian Unix: A Guide to Unix FundamentalsAntediluvian Unix: A Guide to Unix Fundamentals
Antediluvian Unix: A Guide to Unix FundamentalsRicardo Signes
 
Writing Modular Command-line Apps with App::Cmd
Writing Modular Command-line Apps with App::CmdWriting Modular Command-line Apps with App::Cmd
Writing Modular Command-line Apps with App::CmdRicardo Signes
 
Crafting Custom Interfaces with Sub::Exporter
Crafting Custom Interfaces with Sub::ExporterCrafting Custom Interfaces with Sub::Exporter
Crafting Custom Interfaces with Sub::ExporterRicardo Signes
 
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!Ricardo Signes
 

More from Ricardo Signes (9)

Perl 5: Today, Tomorrow, and Christmas
Perl 5: Today, Tomorrow, and ChristmasPerl 5: Today, Tomorrow, and Christmas
Perl 5: Today, Tomorrow, and Christmas
 
Dist::Zilla - Maximum Overkill for CPAN Distributions
Dist::Zilla - Maximum Overkill for CPAN DistributionsDist::Zilla - Maximum Overkill for CPAN Distributions
Dist::Zilla - Maximum Overkill for CPAN Distributions
 
Perl 5.12 for Everyday Use
Perl 5.12 for Everyday UsePerl 5.12 for Everyday Use
Perl 5.12 for Everyday Use
 
i &lt;3 email
i &lt;3 emaili &lt;3 email
i &lt;3 email
 
Dist::Zilla
Dist::ZillaDist::Zilla
Dist::Zilla
 
Antediluvian Unix: A Guide to Unix Fundamentals
Antediluvian Unix: A Guide to Unix FundamentalsAntediluvian Unix: A Guide to Unix Fundamentals
Antediluvian Unix: A Guide to Unix Fundamentals
 
Writing Modular Command-line Apps with App::Cmd
Writing Modular Command-line Apps with App::CmdWriting Modular Command-line Apps with App::Cmd
Writing Modular Command-line Apps with App::Cmd
 
Crafting Custom Interfaces with Sub::Exporter
Crafting Custom Interfaces with Sub::ExporterCrafting Custom Interfaces with Sub::Exporter
Crafting Custom Interfaces with Sub::Exporter
 
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
 

Recently uploaded

Call Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaon
Call Us đŸ“Č8800102216📞 Call Girls In DLF City GurgaonCall Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaon
Call Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaoncallgirls2057
 
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!Doge Mining Website
 
Darshan Hiranandani [News About Next CEO].pdf
Darshan Hiranandani [News About Next CEO].pdfDarshan Hiranandani [News About Next CEO].pdf
Darshan Hiranandani [News About Next CEO].pdfShashank Mehta
 
Kenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith PereraKenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith Pereraictsugar
 
Appkodes Tinder Clone Script with Customisable Solutions.pptx
Appkodes Tinder Clone Script with Customisable Solutions.pptxAppkodes Tinder Clone Script with Customisable Solutions.pptx
Appkodes Tinder Clone Script with Customisable Solutions.pptxappkodes
 
Organizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessOrganizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessSeta Wicaksana
 
Guide Complete Set of Residential Architectural Drawings PDF
Guide Complete Set of Residential Architectural Drawings PDFGuide Complete Set of Residential Architectural Drawings PDF
Guide Complete Set of Residential Architectural Drawings PDFChandresh Chudasama
 
Entrepreneurship lessons in Philippines
Entrepreneurship lessons in  PhilippinesEntrepreneurship lessons in  Philippines
Entrepreneurship lessons in PhilippinesDavidSamuel525586
 
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607(Best) ENJOY Call Girls in Faridabad Ex | 8377087607
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607dollysharma2066
 
International Business Environments and Operations 16th Global Edition test b...
International Business Environments and Operations 16th Global Edition test b...International Business Environments and Operations 16th Global Edition test b...
International Business Environments and Operations 16th Global Edition test b...ssuserf63bd7
 
NewBase 19 April 2024 Energy News issue - 1717 by Khaled Al Awadi.pdf
NewBase  19 April  2024  Energy News issue - 1717 by Khaled Al Awadi.pdfNewBase  19 April  2024  Energy News issue - 1717 by Khaled Al Awadi.pdf
NewBase 19 April 2024 Energy News issue - 1717 by Khaled Al Awadi.pdfKhaled Al Awadi
 
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCRashishs7044
 
Innovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfInnovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfrichard876048
 
TriStar Gold Corporate Presentation - April 2024
TriStar Gold Corporate Presentation - April 2024TriStar Gold Corporate Presentation - April 2024
TriStar Gold Corporate Presentation - April 2024Adnet Communications
 
Annual General Meeting Presentation Slides
Annual General Meeting Presentation SlidesAnnual General Meeting Presentation Slides
Annual General Meeting Presentation SlidesKeppelCorporation
 
1911 Gold Corporate Presentation Apr 2024.pdf
1911 Gold Corporate Presentation Apr 2024.pdf1911 Gold Corporate Presentation Apr 2024.pdf
1911 Gold Corporate Presentation Apr 2024.pdfShaun Heinrichs
 
8447779800, Low rate Call girls in Dwarka mor Delhi NCR
8447779800, Low rate Call girls in Dwarka mor Delhi NCR8447779800, Low rate Call girls in Dwarka mor Delhi NCR
8447779800, Low rate Call girls in Dwarka mor Delhi NCRashishs7044
 
Ten Organizational Design Models to align structure and operations to busines...
Ten Organizational Design Models to align structure and operations to busines...Ten Organizational Design Models to align structure and operations to busines...
Ten Organizational Design Models to align structure and operations to busines...Seta Wicaksana
 

Recently uploaded (20)

Call Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaon
Call Us đŸ“Č8800102216📞 Call Girls In DLF City GurgaonCall Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaon
Call Us đŸ“Č8800102216📞 Call Girls In DLF City Gurgaon
 
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!
Unlocking the Future: Explore Web 3.0 Workshop to Start Earning Today!
 
Darshan Hiranandani [News About Next CEO].pdf
Darshan Hiranandani [News About Next CEO].pdfDarshan Hiranandani [News About Next CEO].pdf
Darshan Hiranandani [News About Next CEO].pdf
 
Kenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith PereraKenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith Perera
 
Appkodes Tinder Clone Script with Customisable Solutions.pptx
Appkodes Tinder Clone Script with Customisable Solutions.pptxAppkodes Tinder Clone Script with Customisable Solutions.pptx
Appkodes Tinder Clone Script with Customisable Solutions.pptx
 
Organizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessOrganizational Structure Running A Successful Business
Organizational Structure Running A Successful Business
 
Call Us ➄9319373153▻Call Girls In North Goa
Call Us ➄9319373153▻Call Girls In North GoaCall Us ➄9319373153▻Call Girls In North Goa
Call Us ➄9319373153▻Call Girls In North Goa
 
Guide Complete Set of Residential Architectural Drawings PDF
Guide Complete Set of Residential Architectural Drawings PDFGuide Complete Set of Residential Architectural Drawings PDF
Guide Complete Set of Residential Architectural Drawings PDF
 
Entrepreneurship lessons in Philippines
Entrepreneurship lessons in  PhilippinesEntrepreneurship lessons in  Philippines
Entrepreneurship lessons in Philippines
 
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607(Best) ENJOY Call Girls in Faridabad Ex | 8377087607
(Best) ENJOY Call Girls in Faridabad Ex | 8377087607
 
No-1 Call Girls In Goa 93193 VIP 73153 Escort service In North Goa Panaji, Ca...
No-1 Call Girls In Goa 93193 VIP 73153 Escort service In North Goa Panaji, Ca...No-1 Call Girls In Goa 93193 VIP 73153 Escort service In North Goa Panaji, Ca...
No-1 Call Girls In Goa 93193 VIP 73153 Escort service In North Goa Panaji, Ca...
 
International Business Environments and Operations 16th Global Edition test b...
International Business Environments and Operations 16th Global Edition test b...International Business Environments and Operations 16th Global Edition test b...
International Business Environments and Operations 16th Global Edition test b...
 
NewBase 19 April 2024 Energy News issue - 1717 by Khaled Al Awadi.pdf
NewBase  19 April  2024  Energy News issue - 1717 by Khaled Al Awadi.pdfNewBase  19 April  2024  Energy News issue - 1717 by Khaled Al Awadi.pdf
NewBase 19 April 2024 Energy News issue - 1717 by Khaled Al Awadi.pdf
 
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
 
Innovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfInnovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdf
 
TriStar Gold Corporate Presentation - April 2024
TriStar Gold Corporate Presentation - April 2024TriStar Gold Corporate Presentation - April 2024
TriStar Gold Corporate Presentation - April 2024
 
Annual General Meeting Presentation Slides
Annual General Meeting Presentation SlidesAnnual General Meeting Presentation Slides
Annual General Meeting Presentation Slides
 
1911 Gold Corporate Presentation Apr 2024.pdf
1911 Gold Corporate Presentation Apr 2024.pdf1911 Gold Corporate Presentation Apr 2024.pdf
1911 Gold Corporate Presentation Apr 2024.pdf
 
8447779800, Low rate Call girls in Dwarka mor Delhi NCR
8447779800, Low rate Call girls in Dwarka mor Delhi NCR8447779800, Low rate Call girls in Dwarka mor Delhi NCR
8447779800, Low rate Call girls in Dwarka mor Delhi NCR
 
Ten Organizational Design Models to align structure and operations to busines...
Ten Organizational Design Models to align structure and operations to busines...Ten Organizational Design Models to align structure and operations to busines...
Ten Organizational Design Models to align structure and operations to busines...
 

Perl 5.10 for People Who Aren't Totally Insane

  • 1. Perl 5.10 for people who are not insane
  • 2. Perl 5.10 for people who are not totally insane
  • 3. 5.10 isn’t like 5.8.x perl5100delta
  • 4. 5.10 isn’t like 5.8.x - features only get added in new 5.x releases perl5100delta
  • 5. 5.10 isn’t like 5.8.x - features only get added in new 5.x releases - it’s been 5 years since the last release (5.8) perl5100delta
  • 6. 5.10 is Way Cool perl51000delta
  • 7. 5.10 is Way Cool - no significant new features in Perl since 2002 perl51000delta
  • 8. 5.10 is Way Cool - no significant new features in Perl since 2002 - remember how bad you wanted to see Star Wars: Episode 1? perl51000delta
  • 9. 5.10 is Way Cool - no significant new features in Perl since 2002 - remember how bad you wanted to see Star Wars: Episode 1? - that’s how excited you should be for 5.10 perl51000delta
  • 10. 5.10 is Way Cool - no significant new features in Perl since 2002 - remember how bad you wanted to see Star Wars: Episode 1? - that’s how excited you should be for 5.10 - but it won’t suck (no POD race scene) perl51000delta
  • 11. Lexicascopasmartwhat? perl51000delta
  • 12. Lexicascopasmartwhat? - lexically scoped user pragmata! perl51000delta
  • 13. Lexicascopasmartwhat? - lexically scoped user pragmata! - pluggable regex compilation engines! perl51000delta
  • 14. Lexicascopasmartwhat? - lexically scoped user pragmata! - pluggable regex compilation engines! - trie-based non-recursive pattern matching! perl51000delta
  • 15. Lexicascopasmartwhat? - lexically scoped user pragmata! - pluggable regex compilation engines! - trie-based non-recursive pattern matching! - thread-safe weak refkey hashes! perl51000delta
  • 16. Yes, You Care perl51000delta
  • 17. Yes, You Care - Not everything in 5.10 is esoteric. perl51000delta
  • 18. Yes, You Care - Not everything in 5.10 is esoteric. - Not everything in 5.10 is for gurus. perl51000delta
  • 19. 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. perl51000delta
  • 20. 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. perl51000delta
  • 21. First: A Warning feature
  • 22. First: A Warning - 5.10 is backwards compatible feature
  • 23. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators feature
  • 24. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default feature
  • 25. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default - use feature ‘mtfnpy’; feature
  • 26. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default - use feature ‘mtfnpy’; - use 5.010; feature
  • 27. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default - use feature ‘mtfnpy’; - use 5.010; - read the perldoc feature
  • 28. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default - use feature ‘mtfnpy’; - use 5.010; - read the perldoc I’m a perldoc ref! feature
  • 29. First: A Warning - 5.10 is backwards compatible - but adds new keywords and operators - they’re not enabled by default - use feature ‘mtfnpy’; - use 5.010; - read the perldoc feature
  • 31. say $what - new built-in, say - it’s like print - but it adds a newline for you perlfunc
  • 32. say $what perlfunc
  • 33. say $what print “Hello, world!n”; perlfunc
  • 34. say $what print “Hello, world!n”; print “$messagen”; perlfunc
  • 35. say $what print “Hello, world!n”; print “$messagen”; print “$_n” for @lines; perlfunc
  • 36. say $what print “Hello, world!n”; say “Hello, world!”; print “$messagen”; print “$_n” for @lines; perlfunc
  • 37. say $what print “Hello, world!n”; say “Hello, world!”; print “$messagen”; say $message; print “$_n” for @lines; perlfunc
  • 38. say $what print “Hello, world!n”; say “Hello, world!”; print “$messagen”; say $message; print “$_n” for @lines; say for @lines; perlfunc
  • 41. truth and definedness sub record_sale { perlop
  • 42. truth and definedness sub record_sale { my ($product, $amount) = @_; perlop
  • 43. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount ||= $product->cost; perlop
  • 44. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount ||= $product->cost; ... perlop
  • 45. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount ||= $product->cost; ... } perlop
  • 46. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount = defined $amount ? $amount : $product->cost; ... } perlop
  • 47. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount ||= $product->cost; ... } perlop
  • 48. truth and definedness sub record_sale { my ($product, $amount) = @_; $amount ||= $product->cost; ... } perlop
  • 49. the new OR operator sub record_sale { my ($product, $amount) = @_; $amount //= $product->cost; ... } perlop
  • 50. the new OR operator $setting = defined $given ? $given : $default; perlop
  • 51. the new OR operator $setting = $given; unless (defined $setting) { $setting = $default; } perlop
  • 52. the new OR operator $setting = $given || $default; perlop
  • 53. the new OR operator $setting = $given // $default; perlop
  • 55. State Variables $lines_left = 100; sub read_line { die “trial period expired” unless $lines_left-- > 0; ... } perlsub
  • 56. State Variables my $lines_left = 100; sub read_line { die “trial period expired” unless $lines_left-- > 0; ... } perlsub
  • 57. State Variables { my $lines_left = 100; sub read_line { die “trial period expired” unless $lines_left-- > 0; ... } } perlsub
  • 58. State Variables package Trial::Period; sub new { my ($class, $arg) = @_; my $guts = { lines_left => $arg->{lines}, error_msg => $arg->{error}, }; return bless $guts => $class; } my $LINES = 100; my $ERROR = “sorry, trial period over”; sub consume_line { my $TRIAL = Trial::Period->new({ my ($self) = @_; lines => $LINES, $self->{lines_left}--; error => $ERROR, } }); sub lines_left { sub read_line { my ($self) = @_; $TRIAL->assert_lines_left; return $self->{lines_left}; ... } } sub assert_lines_left { my ($self) = @_; unless ($self->lines_left) { die $self->{error_msg}; } } 1; perlsub
  • 59. State Variables { my $lines_left = 100; sub read_line { die “trial period expired” unless $lines_left-- > 0; ... } } perlsub
  • 60. State Variables sub read_line { state $lines_left = 100; die “trial period expired” unless $lines_left-- > 0; ... } perlsub
  • 62. Stackable File Tests if ( -f $file and -w $file and -z $file ) { unlink $file; } perlfunc
  • 63. Stackable File Tests if ( -f $file and -w _ and -z _ ) { unlink $file; } perlfunc
  • 64. Stackable File Tests if (-f -w -z $file) { unlink $file; } perlfunc
  • 66. Smart Matching perlsyn
  • 67. Smart Matching - a new kind of comparison operator perlsyn
  • 68. Smart Matching - a new kind of comparison operator - its behavior depends on its inputs perlsyn
  • 69. Smart Matching - a new kind of comparison operator - its behavior depends on its inputs - “if these two things match...” perlsyn
  • 70. 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... perlsyn
  • 71. Smart Matching perlsyn
  • 72. Smart Matching if ($foo ~~ undef) { ... } perlsyn
  • 73. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } perlsyn
  • 74. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } perlsyn
  • 75. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ %hash) { ... } perlsyn
  • 76. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ %hash) { ... } elsif ($foo ~~ qr/re/) { ... } perlsyn
  • 77. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ %hash) { ... } elsif ($foo ~~ qr/re/) { ... } elsif ($foo ~~ $bar) { ... } perlsyn
  • 78. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ %hash) { ... } elsif ($foo ~~ qr/re/) { ... } elsif ($foo ~~ $bar) { ... } else { ... } perlsyn
  • 79. Smart Matching given ($foo) { when (undef) { ... } when (@array) { ... } when ($code) { ... } when (%hash) { ... } when (qr/re/) { ... } when ($bar) { ... } default { ... } } perlsyn
  • 80. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ @array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ %hash) { ... } elsif ($foo ~~ qr/re/) { ... } elsif ($foo ~~ $bar) { ... } else { ... } perlsyn
  • 81. Smart Matching if ($foo ~~ undef) { ... } elsif ($foo ~~ $array) { ... } elsif ($foo ~~ $code) { ... } elsif ($foo ~~ $hash) { ... } elsif ($foo ~~ qr/re/) { ... } elsif ($foo ~~ $bar) { ... } else { ... } perlsyn
  • 83. Smart Matching given ($foo) { when (undef) { ... } when ($aref) { ... } when ($code) { ... } when ($href) { ... } when ($regex) { ... } when ($object) { ... } default { ... } } perlsyn
  • 84. Smart Matching given ($foo) { when ($test_1) { ... } when ($test_2) { ... } when ($test_3) { ... } when ($test_4) { ... } when ($test_5) { ... } when ($test_6) { ... } default { ... } } perlsyn
  • 85. Smart Matching perlsyn
  • 86. Smart Matching @want = @have->where($test) perlsyn
  • 87. Smart Matching @want = @have->where($test) @want = @have->where(sub{ 

 }) perlsyn
  • 88. Smart Matching @want = @have->where($test) @want = @have->where(sub{ 

 }) @want = @have->where(qr/.../sm) perlsyn
  • 89. Smart Matching @want = @have->where($test) @want = @have->where(sub{ 

 }) @want = @have->where(qr/.../sm) @want = @have->where([ 1,2,3 ]) perlsyn
  • 90. Smart Matching perlsyn
  • 92. Smart Matching sub where { my ($array, $test) = @_; perlsyn
  • 93. Smart Matching sub where { my ($array, $test) = @_; if (ref $test eq ‘ARRAY’) { perlsyn
  • 94. Smart Matching sub where { my ($array, $test) = @_; if (ref $test eq ‘ARRAY’) { my %known = map {$_=>1} @$test; perlsyn
  • 95. Smart Matching sub where { my ($array, $test) = @_; if (ref $test eq ‘ARRAY’) { my %known = map {$_=>1} @$test; return grep { $known{$_} } @$array; perlsyn
  • 96. Smart Matching sub where { my ($array, $test) = @_; if (ref $test eq ‘ARRAY’) { my %known = map {$_=>1} @$test; return grep { $known{$_} } @$array; } perlsyn
  • 97. 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’) { perlsyn
  • 98. 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; perlsyn
  • 99. 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; } perlsyn
  • 100. 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’) { perlsyn
  • 101. 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; perlsyn
  • 102. 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; } perlsyn
  • 103. 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” perlsyn
  • 104. 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” } perlsyn
  • 105. Smart Matching sub where { my ($array, $test) = @_; grep { $_ ~~ $test } @$array; } perlsyn
  • 106. Smart Matching SmartMatch::Sugar perlsyn
  • 107. Smart Matching SmartMatch::Sugar @want = @have->where( hash ) perlsyn
  • 108. Smart Matching SmartMatch::Sugar @want = @have->where( hash ) @want = @have->where( class ) perlsyn
  • 109. Smart Matching SmartMatch::Sugar @want = @have->where( hash ) @want = @have->where( class ) @want = @have->where(isa(‘Foo’)) perlsyn
  • 111. Better Error Message(s) $str = “Greetings, $name. Your last login was $last. It is now $time.”; perldiag
  • 112. Better Error Message(s) $str = “Greetings, $name. Your last login was $last. It is now $time.”; Use of uninitialized value in concatenation (.) or string at hello.plx line 9. perldiag
  • 113. Better Error Message(s) $str = “Greetings, $name. Your last login was $last. It is now $time.”; Use of uninitialized value $time in concatenation (.) or string at hello.plx line 9. perldiag
  • 115. Inside-Out Objects Hash::Util::FieldHash
  • 116. Inside-Out Objects - traditional objects are a hashref Hash::Util::FieldHash
  • 117. Inside-Out Objects - traditional objects are a hashref - look up attrs in the obj itself by attr name Hash::Util::FieldHash
  • 118. 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 Hash::Util::FieldHash
  • 119. 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 Hash::Util::FieldHash
  • 120. 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 - there are complications for inside-out objects Hash::Util::FieldHash
  • 121. Inside-Out Objects sub size { my $self = shift; if (@_) { return $self->{size} = shift; } else { return $self->{size}; } } Hash::Util::FieldHash
  • 122. Inside-Out Objects my %size; sub size { my $self = shift; if (@_) { return $size{ $self } = shift; } else { return $size{ $self }; } } Hash::Util::FieldHash
  • 123. Inside-Out Objects my %size; sub size { my $self = shift; my $id = refaddr $self; if (@_) { return $size{ $id } = shift; } else { return $size{ $id }; } } Hash::Util::FieldHash
  • 124. Inside-Out Objects my %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 }; } Hash::Util::FieldHash
  • 125. Inside-Out Objects my %size; sub CLONE { sub size { my $class = shift; my $self = shift; my $id = refaddr $self; my @properties = map { values %$_ } values %PROP_DATA_FOR; if (@_) { return $size{ $id } = shift; for my $old_id ( keys %OBJ ) { } else { return $size{ $id }; my $object = $OBJ{ $old_id }; } my $new_id = refaddr $object; } for my $prop ( @properties ) { sub DESTROY { next unless exists $prop->{ $old }; my $id = refaddr $_[0]; $prop->{ $new } = $prop->{ $old }; delete $size{ $id }; delete $prop->{ $old }; } } weaken ( $OBJ{ $new } = $object ); delete $OBJ{ $old }; } } Hash::Util::FieldHash
  • 126. Inside-Out Objects my %OBJECT_REGISTRY; sub CLONE { my %size; my $class = shift; sub size { my $self = shift; my @properties = map { values %$_ } my $id = refaddr $self; values %PROP_DATA_FOR; $self->register_object; for my $old_id ( keys %OBJECT_REGISTRY ) { if (@_) { return $size{ $self } = shift; my $object = } else { $OBJECT_REGISTRY{ $old_id }; return $size{ $self }; my $new_id = refaddr $object; } } for my $prop ( @properties ) { next unless exists $prop- sub DESTROY { >{ $old_id }; my $id = refaddr $_[0]; $prop->{ $new_id } = $prop- delete $size{ $id }; >{ $old_id }; delete $OBJECT_REGISTRY{ $id }; delete $prop->{ $old_id }; } } sub register_object { weaken ( $OBJECT_REGISTRY{ $new_id } = my ($self) = @_; $object ); my $id = refaddr $self; delete $OBJECT_REGISTRY{ $old_id }; $OBJECT_REGISTRY{ $id } = $self; } } } Hash::Util::FieldHash
  • 127. Field Hashes Hash::Util::FieldHash
  • 128. Field Hashes - they’re just like hashes Hash::Util::FieldHash
  • 129. Field Hashes - they’re just like hashes - objects as keys become object ids Hash::Util::FieldHash
  • 130. Field Hashes - they’re just like hashes - objects as keys become object ids - but get destroyed and cloned Hash::Util::FieldHash
  • 131. Field Hashes my %size; sub size { my $self = shift; if (@_) { return $size{ $self } = shift; } else { return $size{ $self }; } } Hash::Util::FieldHash
  • 132. Field Hashes fieldhash my %size; sub size { my $self = shift; if (@_) { return $size{ $self } = shift; } else { return $size{ $self }; } } Hash::Util::FieldHash
  • 133. Field Hashes { fieldhash my %size; sub size { my $self = shift; if (@_) { return $size{ $self } = shift; } else { return $size{ $self }; } } } Hash::Util::FieldHash
  • 134. Field Hashes sub size { my $self = shift; fieldhash state %size; if (@_) { return $size{ $self } = shift; } else { return $size{ $self }; } } Hash::Util::FieldHash
  • 136. (topic is how you say $_)
  • 137. Lexical Topic for (@lines) { chomp; next if /^#/; next unless length; s/a/b/; sanity_check; say; } perlvar
  • 138. Lexical Topic for my $line (@lines) { chomp $line; next if $line ~~ /^#/; next unless length $line; $line =~ s/a/b/; sanity_check($line); say $line; } perlvar
  • 139. Lexical Topic for my $_ (@lines) { chomp; next if /^#/; next unless length; s/a/b/; sanity_check; say; } perlvar
  • 140. Regex
  • 143. Regex: Named Captures - find matches by name, not position perlre
  • 144. Regex: Named Captures - find matches by name, not position - avoid the dreaded$1 perlre
  • 145. Regex: Named Captures - find matches by name, not position - avoid the dreaded $1 - no longer second to Python or .Net! perlre
  • 146. Regex: Named Captures # our hypothetical format section:property = value perlre
  • 147. Regex: Named Captures $line ~~ /(w+):(w+) = (w+)/; $name = $2; $value = $3; perlre
  • 148. Regex: Named Captures $lhs_re = qr/(w+):(w+)/; $rhs_re = qr/(w+)/; $line ~~ /$lhs_re = $rhs_re/; $name = $2; $value = $3; perlre
  • 149. Regex: Named Captures $line ~~ /$lhs_re = $rhs_re/; $name = $2; $value = $3; perlre
  • 150. Regex: Named Captures $line ~~ /$lhs_re = $rhs_re/; $name = $+{ name }; $value = $+{ value }; perlre
  • 151. Regex: Named Captures $lhs_re = qr/(w+):(w+)/; $rhs_re = qr/(w+)/; perlre
  • 152. Regex: Named Captures $lhs_re = qr/(w+):(?<name>w+)/; $rhs_re = qr/(?<value>w+)/; perlre
  • 154. Regex: Backreference m{< (w+) > .+ < /1 > }x perlre
  • 155. Regex: Backreference m{< (w+) > .+ < /1 > }x perlre
  • 156. Regex: Backreference 10 perlre
  • 157. Regex: Backreference qr{(d)10} perlre
  • 159. Regex: Backreference m{< (w+) > .+ < /1 > }x perlre
  • 160. Regex: Backreference m{< (w+) > .+ < /g{1} > }x perlre
  • 161. Regex: Backreference 10 perlre
  • 162. Regex: Backreference g{10} perlre
  • 163. Regex: Backreference qr{(d)10} perlre
  • 166. Regex: Backreference qr{ (?<digit>d) g{digit} 0 }x perlre
  • 167. Regex: Exit Strategy my $wtf_re = qr{ xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^x80-xf fn015()]*)*)[040t]*)*(?:(?:[^(040)<>@,;:”.[]000-037x80-x ff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|”[^x80-xffn015 “]*(?:[^x80-xff][^x80-xffn015”]*)*”)[040t]*(?:([^x80- xffn015()]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^x80 -xff][^x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040t]* )*(?:.[040t]*(?:([^x80-xffn015()]*(?:(?:[^x80-xff]|([^ x80-xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^ x80-xffn015()]*)*)[040t]*)*(?:[^(040)<>@,;:”.[]000-037x8 0-xff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|”[^x80-xffn 015”]*(?:[^x80-xff][^x80-xffn015”]*)*”)[040t]*(?:([^x 80-xffn015()]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^ x80-xff][^x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040 t]*)*)*@[040t]*(?:([^x80-xffn015()]*(?:(?:[^x80-xff]|([ ^x80-xffn015()]*(?:[^x80-xff][^x80-xffn015()]*)*))[^ x80-xffn015()]*)*)[040t]*)*(?:[^(040)<>@,;:”.[]000-037 x80-xff]+(?![^(040)<>@,;:”.[]000-037x80-xff])|[(?:[^x80- xffn015[]]|[^x80-xff])*])[040t]*(?:([^x80-xffn015() ]*(?:(?:[^x80-xff]|([^x80-xffn015()]*(?:[^x80-xff][^ x80-xffn015()]*)*))[^x80-xffn015()]*)*)[040t]*)*(?:.[04 }; wtf
  • 168. Regex: Backreference if ($str =~ $wtf_re) { ... } perlop
  • 169. Regex: Backreference if ($str ~~ $wtf_re) { ... } perlop
  • 170. lexically scoped alternate trie-based reentrant user- defined regex pragmata
  • 173. Alternate Regex Engines - lets you change how regex work perlreapi
  • 174. Alternate Regex Engines - lets you change how regex work - but not how you use them ( , =~ s///, etc) perlreapi
  • 175. Alternate Regex Engines re::engine::POSIX
  • 176. Alternate Regex Engines egrep -r -l PATTERN DIR re::engine::POSIX
  • 177. Alternate Regex Engines my $regex = qr{ ... }; my @files = $find->file->in( $root ); say for grep { slurp ~~ $re } @files; re::engine::POSIX
  • 178. Alternate Regex Engines re::engine::POSIX
  • 179. Alternate Regex Engines egrep -r -l ‘.+?’ DIR re::engine::POSIX
  • 180. Alternate Regex Engines my $regex = qr{ ... }; my @files = $find->file->in( $root ); say for grep { slurp ~~ $re } @files; re::engine::POSIX
  • 181. Alternate Regex Engines use re::engine::POSIX; my $regex = qr{ ... }; my @files = $find->file->in( $root ); say for grep { slurp ~~ $re } @files; re::engine::POSIX
  • 182. Alternate Regex Engines use re::engine::POSIX; my $regex = qr{ ... }x; my @files = $find->file->in( $root ); say for grep { slurp ~~ $re } @files; re::engine::POSIX