Your SlideShare is downloading. ×
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Advanced modulinos
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Advanced modulinos

1,611

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,611
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ★ Advanced Modulinos brian d foy The Perl Review YAPC::NA 2012
  • 2. Files that work asprograms and modules at the same time
  • 3. Unit testingCode reüseDistribution
  • 4. # hello.pluse v5.10;say Hello World!;
  • 5. % perl hello.plHello World!
  • 6. STDIN $0 STDOUT@ARGV %ENV exit code
  • 7. Starting
  • 8. use v5.10;run();sub run { say Hello World!; }
  • 9. % perl hello.plHello World!% perl -e require q(hello.pl)Hello World!
  • 10. # Hello.pmuse v5.10;run() unless caller;sub run { say Hello World!; }_ _PACKAGE_ _
  • 11. % perl Hello.pmHello World!% perl -MHello -e 1%
  • 12. package Hello;use v5.10;__PACKAGE__->run unless caller;sub run { say Hello World!; }_ _PACKAGE_ _
  • 13. use Test::More;use Test::Output;use_ok( Hello );stdout_ok( sub { Hello->run() }, "Hello World!n", ... );
  • 14. package Hello;use v5.10;_ _PACKAGE_ _->run unless caller;sub run { my( $self ) = @_; say { $self->fh } Hello World!; }
  • 15. package Hello;use v5.10;...;sub fh { *STDOUT }
  • 16. use Test::More;use_ok( Hello );our $string;{open my $fh, >, $string;*Hello::fh = sub { $fh };}Hello->run;is($string, "Hello World!n");
  • 17. package Hello;use v5.10;...;BEGIN {my $fh = *STDOUT;sub fh { $fh }sub set_fh { $fh = ...;}}
  • 18. use Test::More;use_ok( Hello );open my $fh, >, my $string;Hello->set_fh( $fh );Hello->run;is($string, "Hello World!n");
  • 19. % perl hello.plHello World!% perl hello.pl ChicagoHello World!% perl hello.pl -m RahmHello World!% perl hello.pl < aldermenHello World!
  • 20. Connect the command line to new()% hello.pl -s Houston ? use Hello; new() my $app->new( input => $in_fh, output => $out_fh, message => $message, ); $app->greet;
  • 21. sub run { my( $class, @args ) = @_; my %args = $class->process_args(@args); my $self = $class->new(%args); say { $self->fh } $self->message; }
  • 22. sub process_args { require Getopt::Std; local @ARGV = @_; getopts(oim:, my %opts); $opts{o} //= *STDOUT; $opts{i} //= *STDIN; $opts{m} //= Hello World!; # left over @_? my %args = map { $opts_map{$_} => $opts{$_} } keys %opts; }
  • 23. $app->new( input_fh => $in, output_fh => $out, message => Hello World! );
  • 24. sub new { my( $class, %args ) = @_; my $self = bless {}, $class; foreach ( keys %args ) { # maybe more complicated $self->set( $_, $args{$_} ); } return $self; }
  • 25. Stopping
  • 26. #!perl...;...;...;exit(0);
  • 27. sub run { my( $class, @args ) = @_; my $object = eval { ...; Result->new( code => 0 ); } or $@; exit( $object->code ); }
  • 28. sub some_sub { ...; die Result->new( code => 15 ); ...; }
  • 29. sub run { my( $class, @args ) = @_; my $object = eval { ...; Result->new( code => 0 ); }; exit( $error_object->code ); }
  • 30. Testing
  • 31. run() unless caller;
  • 32. UNITCHECK { if($ENV{TEST_HARNESS}){ __PACKAGE__->run_tests; } elsif( ! caller ) { __PACKAGE__->run; } }
  • 33. Docs
  • 34. UNITCHECK { if($ENV{TEST_HARNESS}){ __PACKAGE__->run_tests; } elsif($ENV{PERLDOC}){ __PACKAGE__->show_docs; } elsif( ! caller ) { __PACKAGE__->run; } }

×