My Perl
Bag of Tricks
       
        brian d foy
      The Perl Review
     YAPC::Brasil 2011




 http://slidesha.re/s06nuv
⃠
• Eliminate special cases
• Remove distractions
• Know less
• Let Perl do the work
• Scale gracefully
% perl -e "print qq(Alo Mundon)"

% perl -le "print q(Alo Mundo)"
my $string = some_sub();

open my $fh, '<', $string;

while(<$fh>){
  chomp;
  ...;
  }
use 5.014;

my $new = $old =~ s/.../.../r;

foo( $old =~ s/.../.../r );

print "%s %sn",
  $old,
  $old =~ s/.../.../r
  ;
foreach my $file ( @files ) {
  open my($fh), '>', $file or do {
    warn "... $!n";
    next FILE;
    };
  ...
  }
my $data = do {
  local $/; <DATA>
  };
...;

__END__
<?xml version="1.0"?>
<root>
...
</root>
my $data = do { local $/; <DATA> };

s|.*(?=<elem>)||; s|(?<=</elem>).*||;

my $name =
  m|<elem>(.*?)</elem>|;

__END__
<?xml version="1.0"?>
<root>
...<elem>Buster</elem>
</root>
$g =
 q("Mimi","Bean,Buster","Roscoe");

my @gatos = split /(?<="),(?=")/, $g;
$g =
 q("Roscoe "","" Cat","Bean, Buster");

my @gatos =
 split
   /(?<!"")(?<="),(?=")(?!"")/, $g;
if( ref $r eq 'ARRAY' )

if( ref $r eq ref [] )

if( ref $r eq ref {} )

if( ref $r eq ref sub {} )

if( ref $r eq ref qr// )
join "n", @entries, '';

join "nt", "t", @entries;
BEGIN {
  use Foo;
  package Foo;
  no warnings qw(redefine);
  sub foo { ... }
  }
# Git::CPAN::Patch

% git cpan-init http://...
... hack hack hack ...
% git commit
% git cpan-sendpatch
my $file = MPEG::Info->new( ... );

print
  join $/,
  map {
   $file->$_()
   } qw(acodec
        acodecraw
        achans
        ...
        );
package Modulino {
  run(@ARGV) unless caller;

  sub run {
    my @args = @_;
    ...;
    }

 }
if( /p{IsUppercaseRoman}/ ) {
 ...}

# ⅠⅤⅩⅬⅭⅮⅯↁↂↇↈ
sub IsUppercaseRoman {
    return <<"CODE_NUMBERS";
2160
2164
2169
216C 216F
2181 2182
2187 2188
CODE_NUMBERS
    }
printf
 '%1$#b %1$#o %1$d %1$#xn",
 137;


# 0b10001001 0211 137 0x89
gato( nome => 'Buster' );

sub gato {
  my %defaults = (...);
  my %config = (%defaults, @_ );
  ...;
  }
BEGIN {
  my $fixed_time = 1234567890;
  no warnings qw(redefine);

    *CORE::GLOBAL::time =
       sub { $fixed_time };

    sub set_time {
      $fixed_time = $_[0]
      }
}

ok( time > $fixed_time );
sub my_grep (&@) {
  my( $sub ) = shift;

  foreach my $arg ( @_ ) {
    local $_ = $arg;
    push @output, $arg
      if $sub->()
    }
  }
my $ucfirst_and_trim =
    composer(
      &trim_front,
      &trim_back,
      &my_ucfirst
      );

$s = $ucfirst_and_trim->($s);
sub composer {
   my (@sub_refs) = @_;
   sub {
     my $string = shift;
     foreach my $sub_ref (@sub_refs) {
        $string = $sub_ref->($string);
        }
     return $string;
     };
   }
my @tests = (
  # ARG EXPECTED LABEL
  [ [1,2,3], 6, 'Sum is 6' ],
  [ [-1,0,9], 8, 'Sum is 8' ],
  ...
  );

foreach my $test ( @tests ) {
  is(
    target_sub( $test->[ARG] ),
    $test->[EXPECTED],
    $test->[LABEL]
    );
  }
package Local::Null::Logger {
  sub new { bless  my $x, $_[0] }
  sub AUTOLOAD { shift; print @_, $/ }
  sub DESTROY { 1 }
  }

sub _init_logger {
  my $log4perl_loaded =
    eval "require Log::Log4perl; 1";

 unless( $log4perl_loaded ){
   return Local::Null::Logger->new;
   }
 ...;
 }
$object->foo->bar->baz->quux;

package Class {
  sub bar {
      return Null->new if $error;
      }
  }

package Null {
  my $null = bless {}, __PACKAGE__;
  sub new { $null }
  sub AUTOLOAD { return $_[0] }
  sub DESTROY { 1 }
  }
Obrigado

http://slidesha.re/s06nuv
http://commons.wikimedia.org/wiki/File:Pelé_jump_1958.jpg




http://commons.wikimedia.org/wiki/File:Brazilian_National_Congress.jpg

Bag of tricks

  • 1.
    My Perl Bag ofTricks brian d foy The Perl Review YAPC::Brasil 2011 http://slidesha.re/s06nuv
  • 5.
  • 6.
    • Eliminate specialcases • Remove distractions • Know less • Let Perl do the work • Scale gracefully
  • 7.
    % perl -e"print qq(Alo Mundon)" % perl -le "print q(Alo Mundo)"
  • 8.
    my $string =some_sub(); open my $fh, '<', $string; while(<$fh>){ chomp; ...; }
  • 9.
    use 5.014; my $new= $old =~ s/.../.../r; foo( $old =~ s/.../.../r ); print "%s %sn", $old, $old =~ s/.../.../r ;
  • 10.
    foreach my $file( @files ) { open my($fh), '>', $file or do { warn "... $!n"; next FILE; }; ... }
  • 11.
    my $data =do { local $/; <DATA> }; ...; __END__ <?xml version="1.0"?> <root> ... </root>
  • 12.
    my $data =do { local $/; <DATA> }; s|.*(?=<elem>)||; s|(?<=</elem>).*||; my $name = m|<elem>(.*?)</elem>|; __END__ <?xml version="1.0"?> <root> ...<elem>Buster</elem> </root>
  • 13.
    $g = q("Mimi","Bean,Buster","Roscoe"); my@gatos = split /(?<="),(?=")/, $g;
  • 14.
    $g = q("Roscoe"","" Cat","Bean, Buster"); my @gatos = split /(?<!"")(?<="),(?=")(?!"")/, $g;
  • 15.
    if( ref $req 'ARRAY' ) if( ref $r eq ref [] ) if( ref $r eq ref {} ) if( ref $r eq ref sub {} ) if( ref $r eq ref qr// )
  • 16.
    join "n", @entries,''; join "nt", "t", @entries;
  • 17.
    BEGIN { use Foo; package Foo; no warnings qw(redefine); sub foo { ... } }
  • 18.
    # Git::CPAN::Patch % gitcpan-init http://... ... hack hack hack ... % git commit % git cpan-sendpatch
  • 19.
    my $file =MPEG::Info->new( ... ); print join $/, map { $file->$_() } qw(acodec acodecraw achans ... );
  • 20.
    package Modulino { run(@ARGV) unless caller; sub run { my @args = @_; ...; } }
  • 21.
    if( /p{IsUppercaseRoman}/ ){ ...} # ⅠⅤⅩⅬⅭⅮⅯↁↂↇↈ sub IsUppercaseRoman { return <<"CODE_NUMBERS"; 2160 2164 2169 216C 216F 2181 2182 2187 2188 CODE_NUMBERS }
  • 22.
    printf '%1$#b %1$#o%1$d %1$#xn", 137; # 0b10001001 0211 137 0x89
  • 23.
    gato( nome =>'Buster' ); sub gato { my %defaults = (...); my %config = (%defaults, @_ ); ...; }
  • 24.
    BEGIN { my $fixed_time = 1234567890; no warnings qw(redefine); *CORE::GLOBAL::time = sub { $fixed_time }; sub set_time { $fixed_time = $_[0] } } ok( time > $fixed_time );
  • 25.
    sub my_grep (&@){ my( $sub ) = shift; foreach my $arg ( @_ ) { local $_ = $arg; push @output, $arg if $sub->() } }
  • 26.
    my $ucfirst_and_trim = composer( &trim_front, &trim_back, &my_ucfirst ); $s = $ucfirst_and_trim->($s);
  • 27.
    sub composer { my (@sub_refs) = @_; sub { my $string = shift; foreach my $sub_ref (@sub_refs) { $string = $sub_ref->($string); } return $string; }; }
  • 28.
    my @tests =( # ARG EXPECTED LABEL [ [1,2,3], 6, 'Sum is 6' ], [ [-1,0,9], 8, 'Sum is 8' ], ... ); foreach my $test ( @tests ) { is( target_sub( $test->[ARG] ), $test->[EXPECTED], $test->[LABEL] ); }
  • 29.
    package Local::Null::Logger { sub new { bless my $x, $_[0] } sub AUTOLOAD { shift; print @_, $/ } sub DESTROY { 1 } } sub _init_logger { my $log4perl_loaded = eval "require Log::Log4perl; 1"; unless( $log4perl_loaded ){ return Local::Null::Logger->new; } ...; }
  • 30.
    $object->foo->bar->baz->quux; package Class { sub bar { return Null->new if $error; } } package Null { my $null = bless {}, __PACKAGE__; sub new { $null } sub AUTOLOAD { return $_[0] } sub DESTROY { 1 } }
  • 31.
  • 32.