Perl 5.10
 in 2010
Part I
The History
and some
Statistics
5.10.0
18 December 2007
Today is
5 March 2010
810 days
 passed
5.10.1
exists already
5.11.0, 5.11.1,
5.11.2, 5.11.3, 5.11.4
exist already
5.12
soon
Dutch Perl Workshop 2010

Andrew Shitov
Perl 5.10 in 2010

Leon Timmermans
What's new in Perl 5.12?

Martin Berends
Perl 6...
Total on CPAN
 ~80 000 modules
Total on CPAN
~20 000 distributions
Total on CPAN
 ~8000 authors
Are Perl 5.10
features used
 frequently?
?
~ 200 modules
~ 100 authors
Part II
Perl 5.10 Features
say
   say
$x
     ==
print
"$xn"
~~
$a
~~
/d/
$a
~~
@list
@list
~~
%hash
switch
given($x)
{




when(/a/)
{...}




when('b')
{...}




default


{...}
}
state
sub
counter
{




state
$c
=
0;




return
++$c;
}
regexes
(?<name>)   %+
K          %‐
R          g<name>
//
 $city
=
$arg
//
'Moscow';

$vacancy{city}
//=
'Moscow';
Part III
Ontology
How to enable
use
5.010000;
use
5.01001;
use
5.010;
use
5.010_000;
use
5.10.0;
use
v5.10.0;
use
v5.10;
use
feature
':5.10';
5.10.0
         v5.10.0
         v5.10

vector string
version string

abbreviated — v-string
5.10.0
         v5.10.0
         v5.10

vector string
version string

abbreviated — v-string
say for debugging
given
($action)
{




when
(/^include_cmd:/)
{








my
$cmd
=
$child‐>content;








$cmd
=~
/^include_cmd:(s*)/;



...
// and //=
for default values
$port
//=

5432;
$host
//=
'localhost';

$col

//=
'';




Pg::Loader — 07 Jul 2008
Perl extension for loading Postgres ta...
$attrz{
maxjob

}
//=
1;
$value
//=
1;

$attrz{
$_
}
//=
0;
$attrz{
verbose
}
//=
'';
$attrz{
debug


}
//=
'';
$val
//=
1...
sub
import


{




shift;




my
%args
=
@_;




#
we
do
not
care
about
autoviv




$^H{fixedtime}
=
$args{epoch_offset}
/...
say
$answer
//





"I
don't
know
enough
to
answer
you
yet.";




Hailo — 29 Jan 2010
A pluggable Markov engine analogous ...
my
$marpa_version

=





$Parse::Marpa::VERSION
//
'undef';
my
$source_version
=





$Parse::Marpa::Source::VERSION
//
'...
my
$nulling_symbol
=


$rhs_symbol‐>[Parse::Marpa::Internal::Symbol::NULL_ALIAS]
//
$rhs_symbol;

$action
//=
$default_act...
my
$trace_fh
=
$arg_trace_fh
//
(*STDERR);

my
$trace_fh
=
shift;
$trace_fh
//=
*STDERR;




Parse::Marpa::Recognizer
— 14...
// inside return
return
$self‐>_get_infection(
$disease‐>id
)
//
0;

my
$val
=
$self‐>_get($key)
//
$default‐>{$key};



return
@{
$self‐>_...
sub
homedir
{


my
($self)
=
@_;


require
File::HomeDir;


return
File::HomeDir‐>my_home




//
croak
'File::HomeDir
says...
sub
config_filename
{


my
($self)
=
@_;


return
$self‐>{'config_filename'}
//
do
{




require
File::Spec;




File::Spe...
return




isodate_to_rfc822($date
//
$self‐>{'now822'});

return
URI::Title::title




({
url

=>
($resp‐>request‐>uri
//...
return
inside //
my
$b_time
=
$self‐>item_to_timet($b_item)



//
return
$a_item;

my
$a_time
=
$self‐>item_to_timet($a_item)




//
return...
return
(elt_to_email
($item‐>first_child('author'))








//
elt_to_email
($item


‐>first_child('dc:creator'))








...
sub
item_to_language
{


my
($self,
$item)
=
@_;


my
$content;


my
$ret
=
(elt_to_language($item)













//
elt_to...
Chained
//



my
$captures



=
$arg
{captures}






//
[];



my
$comment




=
escape
$arg
{comment}
//
$name
//
"";



my
$upgrad...
when with a scalar




while
(my
($key,
$value)
=
each
%arg)
{








given
($key)
{












when
("tests")
{
















$Test
‐>
p...




foreach
(@hazards)
{








when
($WUMPUS)
{












$self
‐>
lose;












push
@messages
=>
"Oops!
Bumped
i...
when for selection
given
($k)
{




when
('file')



{
$opt_file




=
$v;
}




when
('argv')



{
$opt_argv




=
$v;
}




when
('inter')
...
given
($inp_typ)




when
('f')
.
.
.




when
('a')
.
.
.




when
('i')
.
.
.




default
{








die
"Internal
error:...
when
with a boolean value
unless
(
'itan'
~~
@list
)
{




given
(
length
$password
)
{








when
(
16
)
{












#
ok








}








whe...
unless
(
'itan'
~~
@list
)
{




given
(
length
$password
)
{








when
(
16
)
{












#
ok








}








whe...
when
with regular expressions
sub
range2list
{

 my
$_
=
shift;

 given
($_)
{

 
 when
(/^(d)‐(d)$/o
)


{
return
"$1..$2"
}

 
 when
(/^d..d$/o
)




...
when and ref




given(ref
$fdef){








when('ARRAY'){




Package::FromData
— 14 Jan 2008
generate a package with methods and varia...
when and undef
given
($1)
{




when
(undef)

{return}




when
($left)

{
$depth++;
}




when
($right)
{
$depth‐‐;
}
}




Parse::Marpa...
given
($action)
{




when
(undef)
{;}



#
do
nothing
























#
Right
now
do
nothing




















...
Nested given/when
given($name)
{




when
('stream:stream')
.
.
.




when
('challenge')
.
.
.




when
('failure')
.
.
.




when
('stream:...
given($name)
{




when
('stream:stream')
.
.
.




when
('challenge')
.
.
.




when
('failure')
.
.
.




when
('stream:...
for and when
for
(
catch
)
{


when
(
$_‐>isa('Getopt::Lucid::Exception::ARGV')
)
{




say;




#
usage
stuff




return
1;


}


defa...
~~
return
_fail(
$pkg,
$sub
)
if
$_
~~
0;



if
(
$attr
~~
/^Export_?Lexical$/i
)
{




Export::Lexical
— 09 Oct 2008
Lexical...
@exportz



=
grep
{
!
(
$_
~~
@argz
)
}
@_;



$disp
~~
@exportz









or
push
@exportz,
$disp;




Exporter::Proxy
— ...
@exportz



=
grep
{
!
(
$_
~~
@argz
)
}
@_;



$disp
~~
@exportz









or
push
@exportz,
$disp;
                      ...
$disp
~~
@exportz









or
push
@exportz,
$disp;




push
@exportz,
$disp
unless
$disp
~~
@exportz
for(
@_
)




{








index
$_,
':'








or
next;









if(
$_
~~
@exportz
)








{












my
$source

=
q...
for(
@_
)




{








index
$_,
':'








or
next;
                                                 Maybe when?






...
48 files, and only single one
(Maplat::Helpers::CommandHelper)
 uses 5.10 feature
Maplat                                   ...
48 files, and only single one
 (Maplat::Helpers::CommandHelper)
  uses 5.10 feature




if($line‐>{id}
~~
%active)




 Map...
Named capturing parens





my
$compiled_regex
=
qr{









G









(?<mArPa_prefix>$prefix)









(?<mArPa_match>$regex)









(?<mAr...
Part IV
Antipatterns
use
5.010;
            use
feature
':5.10';




App::TemplateServer



$show_line
//=
1








if
$style
eq
'Regexp::Common';




  SmartMatch::Sugar
  Regexp-CharClasses
use
Switch;
 switch($stream‐>codec_type){
 
 
 
 case
"video"
{
 
 
 
 
 bless
$stream,
'Video::FFmpeg::AVStream::Video';
...
my
$prefix
=
$symbol_prefix
//
$default_prefix;
$prefix
=
qr/$prefix/xms
if
defined
$prefix;

my
$suffix
=
$symbol_suffix
...
$isPermaLink
=




(lc($guid‐>att('isPermaLink')
//
'true')




eq
'true');




App::RSS2Leafnode
— 02 Feb 2010
post RSS f...
$isPermaLink
=




(lc($guid‐>att('isPermaLink')
//
'true')




eq
'true');



say
'False'
if
length($bool_value)
==
5;
given
(
$params[0]
//
''
)
{




when
(blessed
$_
&&
$_‐>isa('Math::BigInt'))
{








$bit
=
$class‐>string2bit(shift(@p...
while
(
my
(
$option,
$value
)
=
each
%{$args}
)
{





given
($option)
{









when
('rules')
{









when
('termin...
my
$attrz











=
local
$que‐>{
attrib
}











=
$job2attrz{
$job_id
}











//=
$que‐>merge_attrib(
$job_i...
foreach
my
$shipment
(@{$response‐>shipment})
{




say
".==========================================.";




say
"|
Shipmen...
use
5.010000;

            print
"n";
            print
"
chaptersn";




DVD::Read
— 16 Nov 2008
libdvdread perl binding
do_something()
//
return
NOT_FOUND;
do_something()
//
return
NOT_FOUND;




is_leap_year()





?
($n
=
366)





:
($n
=
365)




;
Part V
Use cases
Part V
Use cases
and what to care about
How to enable
use
v5.10;

use
Modern::Perl;

use
common::sense;
use
feature
':5.10.1';
use
feature
':5.10';
use
feature
':5.10.1';
use
feature
':5.10';

           5.10 reads entire string
use
feature
':5.10.1';
use
feature
':5.10';

           5.10 reads entire string



use
feature
':5.10.1';
use
feature
':5...
use
feature
':5.10.1';
use
feature
':5.10';

           5.10 reads entire string



use
feature
':5.10.1';
use
feature
':5...
use
everywhere
q(feature
':5.10');
use
MyModule;
MyModule‐>my_sub($$);
use
everywhere
q(feature
':5.10');
use
MyModule;
MyModule‐>my_sub($$);



package
MyModule;
sub
my_sub
{




say
$_[1];
}
...
>
perl
‐E
"say
$$;"
~~ to check
if something is in the list
if
($last_name
~~
@attendees)
{...}
~~ to compare arrays
my
@a
=
(1,
3,
5);
my
@b
=
(1,
3,
5);
say
@a
~~
@b;
#
1
my
@a
=
(1,
3,





5);
my
@b
=
(1,
qr/d/,
5);
say
@a
~~
@b;
#
1




               Note, this
               is not
     ...
my
@a
=
(1,
3,





5);
my
@b
=
(1,
qr/d/,
5);
say
@a
~~
@b;
#
1




               Note, this
                  is
      ...
~~ to check
command line arguments
%
./some_programme
‐‐debug
‐d
%
./some_programme
‐‐debug
‐d


say
'Debug'

if
'‐‐debug'
~~
@ARGV;
say
'Daemon'
if
'‐d'
~~
@ARGV;
%
./some_programme
‐‐debug
‐d


say
'Debug'

if
'‐‐debug'
~~
@ARGV;
say
'Daemon'
if
'‐d'
~~
@ARGV;


say
'Help'





if
/^...
Chained //
my
$ip
=





$ENV{X_HTTP_FORWARDED_FOR}
//




$ENV{HTTP_X_REAL_IP}






//




$ENV{REMOTE_ADDR};
my
$ip
=





$page‐>param('request_ip')
//




$ENV{X_HTTP_FORWARDED_FOR}
//




$ENV{HTTP_X_REAL_IP}






//




$ENV{R...
my
$ip
=





$ENV{HTTP_X_REAL_IP}






//




$page‐>param('request_ip')
//




$ENV{X_HTTP_FORWARDED_FOR}
//




$ENV{R...
state for counters
sub
count
{




state
$c;




return
++$c;
}


say
count();
#
1
say
count();
#
2
state
$count;
unless
($count)
{




#
SQL‐query
select
count(*)
...
}


my
$offset
=
int
rand
$count;
#
SQL‐query

#
selec...
for and when
use
v5.10;
my
@array
=
(1..20);
my
$count
=
0;
for(@array)
{




when(/[02468]$/)
{








$count++;




}




say;
}
say...
use
v5.10;
my
@array
=
(1..20);
my
$count
=
0;
for(@array)
{




when(/[02468]$/)
{








$count++;




}




say;
}
say...
use
v5.10;
my
@array
=
(1..20);
my
$count
=
0;
for(@array)
{




when(/[02468]$/)
{








$count++;




}




say;
}
say...
1
use
v5.10;
                         3
my
@array
=
(1..20);
my
$count
=
0;           5
for(@array)
{            7




whe...
use
v5.10;
my
@array
=
(1..20);
my
$count
=
0;
for(@array)
{




when(/[02468]$/)
{








$count++;
continue;




}




...
>
perl5.10
‐E



"say
for
1..3"



>
perl6
‐e



"say
for
1..3"
>
perl5.10
‐E
    1


"say
for
1..3"   2
                   3

>
perl6
‐e
       n


"say
for
1..3"   n
                  ...
More

     A number of
fascinating and useful
    regex features
Part V.X
__END__


Andrew Shitov
andy@shitov.ru   talks.shitov.ru
Perl 5.10 in 2010
Perl 5.10 in 2010
Perl 5.10 in 2010
Upcoming SlideShare
Loading in …5
×

Perl 5.10 in 2010

1,226 views

Published on

Which features of Perl 5.10 are in use in today's CPAN modules; how not to make mistakes; and a number of use cases of how to use Perl 5.10 features.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,226
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
13
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Perl 5.10 in 2010

  1. 1. Perl 5.10 in 2010
  2. 2. Part I The History and some Statistics
  3. 3. 5.10.0 18 December 2007
  4. 4. Today is 5 March 2010
  5. 5. 810 days passed
  6. 6. 5.10.1 exists already
  7. 7. 5.11.0, 5.11.1, 5.11.2, 5.11.3, 5.11.4 exist already
  8. 8. 5.12 soon
  9. 9. Dutch Perl Workshop 2010 Andrew Shitov Perl 5.10 in 2010 Leon Timmermans What's new in Perl 5.12? Martin Berends Perl 6 implementations in March 2010 Jonathan Worthington Solved in Perl 6
  10. 10. Total on CPAN ~80 000 modules
  11. 11. Total on CPAN ~20 000 distributions
  12. 12. Total on CPAN ~8000 authors
  13. 13. Are Perl 5.10 features used frequently?
  14. 14. ?
  15. 15. ~ 200 modules
  16. 16. ~ 100 authors
  17. 17. Part II Perl 5.10 Features
  18. 18. say say
$x == print
"$xn"
  19. 19. ~~ $a
~~
/d/ $a
~~
@list @list
~~
%hash
  20. 20. switch given($x)
{ 



when(/a/)
{...} 



when('b')
{...} 



default


{...} }
  21. 21. state sub
counter
{ 



state
$c
=
0; 



return
++$c; }
  22. 22. regexes (?<name>) %+ K %‐ R g<name>
  23. 23. // $city
=
$arg
//
'Moscow'; $vacancy{city}
//=
'Moscow';
  24. 24. Part III Ontology
  25. 25. How to enable
  26. 26. use
5.010000; use
5.01001; use
5.010; use
5.010_000; use
5.10.0; use
v5.10.0; use
v5.10; use
feature
':5.10';
  27. 27. 5.10.0 v5.10.0 v5.10 vector string version string abbreviated — v-string
  28. 28. 5.10.0 v5.10.0 v5.10 vector string version string abbreviated — v-string
  29. 29. say for debugging
  30. 30. given
($action)
{ 



when
(/^include_cmd:/)
{ 







my
$cmd
=
$child‐>content; 







$cmd
=~
/^include_cmd:(s*)/; 







my
$ws
=
$1
||
''; 







$cmd
=~
s/^include_cmd:s*//; 







#say("cmd:$ws$cmd"); 







$cmd
=
cwd()
.
'/'
.
$cmd; 







@output
=
qx($cmd); 







$child‐>content($ws
.
join($ws,
@output)); 



} Pod::Elemental::Transformer::Include
— 08 Jan 2010 include output via files and commands
  31. 31. // and //= for default values
  32. 32. $port
//=

5432; $host
//=
'localhost'; $col

//=
''; Pg::Loader — 07 Jul 2008 Perl extension for loading Postgres tables
  33. 33. $attrz{
maxjob

}
//=
1; $value
//=
1; $attrz{
$_
}
//=
0; $attrz{
verbose
}
//=
''; $attrz{
debug


}
//=
''; $val
//=
1; $exit
//=
0; $skipz‐>{
$job_id
}
//=
'Skip
on
SIGHUP' Parallel::Depend — 12 Aug 2009 Parallel-dependent dispatch of perl or shell code
  34. 34. sub
import


{ 



shift; 



my
%args
=
@_; 



#
we
do
not
care
about
autoviv 



$^H{fixedtime}
=
$args{epoch_offset}
//
 




















CORE::time; } fixedtime — 14 Aug 2008 lexical pragma to fix the epoch offset for time related functions
  35. 35. say
$answer
//
 



"I
don't
know
enough
to
answer
you
yet."; Hailo — 29 Jan 2010 A pluggable Markov engine analogous to MegaHAL
  36. 36. my
$marpa_version

=
 



$Parse::Marpa::VERSION
//
'undef'; my
$source_version
=
 



$Parse::Marpa::Source::VERSION
//
'undef'; $options
//=
{}; Parse::Marpa — 14 Dec 2008 Generate Parsers from any BNF grammar
  37. 37. my
$nulling_symbol
= 

$rhs_symbol‐>[Parse::Marpa::Internal::Symbol::NULL_ALIAS]
//
$rhs_symbol; $action
//=
$default_action; say
{$trace_fh} 



'Problems
compiling
action
for
original
rule:
', 



Parse::Marpa::brief_original_rule($rule); my
$clone
=
$clone_arg
//
1; my
$current_parse_set
=
$parse_set_arg
//
$default_parse_set; $choice
//=
0; $lines
//=
[0]; $source_options
//=
{}; Parse::Marpa::Internal::Evaluator
— 14 Dec 2008 Generate Parsers from any BNF grammar
  38. 38. my
$trace_fh
=
$arg_trace_fh
//
(*STDERR); my
$trace_fh
=
shift; $trace_fh
//=
*STDERR; Parse::Marpa::Recognizer
— 14 Dec 2008 Generate Parsers from any BNF grammar
  39. 39. // inside return
  40. 40. return
$self‐>_get_infection(
$disease‐>id
)
//
0; my
$val
=
$self‐>_get($key)
//
$default‐>{$key}; return
@{
$self‐>_players
//
[]
}; Games::Pandemic::City,
Games::Pandemic::Config
— 07 Sep 2009 Games::Risk
— 18 Oct 2008
  41. 41. sub
homedir
{ 

my
($self)
=
@_; 

require
File::HomeDir; 

return
File::HomeDir‐>my_home 



//
croak
'File::HomeDir
says
you
have
no
home 













directory'; } App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  42. 42. sub
config_filename
{ 

my
($self)
=
@_; 

return
$self‐>{'config_filename'}
//
do
{ 



require
File::Spec; 



File::Spec‐>catfile
 







($self‐>homedir,
'.rss2leafnode.conf'); 

}; } App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  43. 43. return
 


isodate_to_rfc822($date
//
$self‐>{'now822'}); return
URI::Title::title 



({
url

=>
($resp‐>request‐>uri
//
''), 






data
=>
$resp‐>decoded_content
 






(charset
=>
'none')}); App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  44. 44. return
inside //
  45. 45. my
$b_time
=
$self‐>item_to_timet($b_item) 


//
return
$a_item; my
$a_time
=
$self‐>item_to_timet($a_item)
 


//
return
$b_item;; my
$str
=
$self‐>item_to_date($item)
 


//
return; App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  46. 46. return
(elt_to_email
($item‐>first_child('author')) 







//
elt_to_email
($item


‐>first_child('dc:creator')) 







//
elt_to_email
($item


‐>first_child('dc:contributor')) 







//
non_empty
($item‐>first_child_text('wiki:username')) 







//
elt_to_email
($channel‐>first_child('dc:creator')) 







//
elt_to_email
($channel‐>first_child('author')) 







//
elt_to_email
($channel‐>first_child('managingEditor')) 







//
elt_to_email
($channel‐>first_child('webMaster')) 







//
elt_to_email
($item


‐>first_child('dc:publisher')) 







//
elt_to_email
($channel‐>first_child('dc:publisher')) 







//
non_empty
($channel‐>first_child_text('title')) 







#
RFC822 







//
'nobody@'.$self‐>uri_to_host 






); App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  47. 47. sub
item_to_language
{ 

my
($self,
$item)
=
@_; 

my
$content; 

my
$ret
=
(elt_to_language($item) 












//
elt_to_language($item‐>first_child('content'))); 

for
(;;)
{ 



$item
=
$item‐>parent
//
last; 



$ret
//=
elt_to_language($item); 

} 

$ret
//=
$self‐>{'resp'}‐>content_language; 

return
$ret; } App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  48. 48. Chained
//
  49. 49. 


my
$captures



=
$arg
{captures}






//
[]; 


my
$comment




=
escape
$arg
{comment}
//
$name
//
""; 


my
$upgrade




=
$arg
{utf8_upgrade}


//
1; 


my
$downgrade


=
$arg
{utf8_downgrade}
//
1; 


my
$match






=
$arg
{match}









//
1; Games::Wumpus
— 24 Nov 2009 Play Hunt the Wumpus
  50. 50. when with a scalar
  51. 51. 



while
(my
($key,
$value)
=
each
%arg)
{ 







given
($key)
{ 











when
("tests")
{ 















$Test
‐>
plan
($value); 











} 











when
("import")
{ 















$self
‐>
export_to_level
(1,
$self,
$_)
for
@{$value
||
[]}; 











} 











default
{ 















die
"Unknown
option
'$key'n"; 











} 







} 



} Test::Regexp
— 09 Dec 2009 Test your regular expressions
  52. 52. 



foreach
(@hazards)
{ 







when
($WUMPUS)
{ 











$self
‐>
lose; 











push
@messages
=>
"Oops!
Bumped
into
a
Wumpus!"; 







} 







when
($PIT)
{ 











$self
‐>
lose; 











push
@messages
=>
"YYYIIIIEEEE!
Fell
in
a
pit!"; 







} 







when
($BAT)
{ 











push
@messages
=>
 

















"ZAP!
Super
bat
snatch!
Elsewhereville
for
you!"; 







} 



} Games::Wumpus
— 24 Nov 2009 Play Hunt the Wumpus
  53. 53. when for selection
  54. 54. given
($k)
{ 



when
('file')



{
$opt_file




=
$v;
} 



when
('argv')



{
$opt_argv




=
$v;
} 



when
('inter')


{
$opt_interact
=
$v;
} 



when
('prompt')

{
$opt_prompt


=
$v;
} 



when
('quiet')


{
$opt_quiet



=
$v;
} 



when
('tty_in')

{
$tty_in






=
$v;
} 



when
('tty_out')
{
$tty_out





=
$v;
} 



default
{ 







die
"Error:
in
subroutine
set_opt(),
found
invalid
key
{$k
=>
'$v'} 












(not
'file',
'argv',
'inter',
'prompt',
'quiet', 












'tty_in'
or
'tty_out')"; 



} } Term::DBPrompt
— 18 Dec 2009 Commandline prompt for a database application
  55. 55. given
($inp_typ) 



when
('f')
.
.
. 



when
('a')
.
.
. 



when
('i')
.
.
. 



default
{ 







die
"Internal
error:
type
=
'$inp_typ'
(not
'f',
'a'
or
'i')"; 



} } Term::DBPrompt
— 18 Dec 2009 Commandline prompt for a database application
  56. 56. when with a boolean value
  57. 57. unless
(
'itan'
~~
@list
)
{ 



given
(
length
$password
)
{ 







when
(
16
)
{ 











#
ok 







} 







when
(
$_
<
4
)
{ 











die('ERROR:
Password
is
too
short
(Min
4
bytes
required)'); 







} 







when
(
$_
>
16
)
{ 











die('ERROR:
Password
is
too
long
(Max
16
bytes
allowed)'); 







} 







default
{ 











while
(1)
{ 















$password
.=
'0'; 















last
 



















if
length
$password
==
16; 











} 







} 



} App::iTan::Utils
— 26 Oct 2009 Secure management of iTans for online banking
  58. 58. unless
(
'itan'
~~
@list
)
{ 



given
(
length
$password
)
{ 







when
(
16
)
{ 











#
ok 







} 







when
(
$_
<
4
)
{ 











die('ERROR:
Password
is
too
short
(Min
4
bytes
required)'); 







} 







when
(
$_
>
16
)
{ 











die('ERROR:
Password
is
too
long
(Max
16
bytes
allowed)'); 







} 







default
{ 











while
(1)
{ 















$password
.=
'0'; 















last
 



















if
length
$password
==
16; 











} 







} 



} App::iTan::Utils
— 26 Oct 2009 Secure management of iTans for online banking
  59. 59. when with regular expressions
  60. 60. sub
range2list
{ 
 my
$_
=
shift; 
 given
($_)
{ 
 
 when
(/^(d)‐(d)$/o
)


{
return
"$1..$2"
} 
 
 when
(/^d..d$/o
)




{
return
"$_"
} 
 
 when
(/^d$/o
)










{
return
$_} 
 
 when
(/^(.*?),(.*)$/o
)


{
return
range2list($1).
',' 







































.range2list($2)} 
 
 default


















{
return
''} 
 } } Catalyst::Devel
  61. 61. when and ref
  62. 62. 



given(ref
$fdef){ 







when('ARRAY'){ Package::FromData
— 14 Jan 2008 generate a package with methods and variables from a data structure
  63. 63. when and undef
  64. 64. given
($1)
{ 



when
(undef)

{return} 



when
($left)

{
$depth++;
} 



when
($right)
{
$depth‐‐;
} } Parse::Marpa::Lex
  65. 65. given
($action)
{ 



when
(undef)
{;}



#
do
nothing 























#
Right
now
do
nothing
 























#
but
find
lex_q_quote 



when
('lex_q_quote')
{ 







$lexers[$ix]
= 











[
&Parse::Marpa::Lex::lex_q_quote, 














$prefix,
$suffix
]; 



} Parse::Marpa::Recognizer
  66. 66. Nested given/when
  67. 67. given($name)
{ 



when
('stream:stream')
.
.
. 



when
('challenge')
.
.
. 



when
('failure')
.
.
. 



when
('stream:features')
.
.
.
 







given(my
$clist
=
$node‐>getChildrenHash())
{ 











when
('starttls')
.
.
. 











when('mechanisms')
.
.
. 















foreach($clist‐>{'mechanisms'}‐> 

















[0]‐>getChildrenByTagName('*')) 



















when($_‐>textContent()
eq
'DIGEST‐MD5'
 





















or
$_‐>textContent()
eq
'PLAIN') 











when('bind')
.
.
. 











default
.
.
. 



when
('proceed')
.
.
. 



when
('success')
.
.
. POE::Component::Jabber
— 22 Mar 2009 A POE Component for communicating over Jabber
  68. 68. given($name)
{ 



when
('stream:stream')
.
.
. 



when
('challenge')
.
.
. 



when
('failure')
.
.
. 



when
('stream:features')
.
.
. 







given(my
$clist
=
$node‐>getChildrenHash())
{ 











when
('starttls')
.
.
. 











when('mechanisms')
.
.
.
 















foreach($clist‐>{'mechanisms'}‐> 

















[0]‐>getChildrenByTagName('*')) 



















when($_‐>textContent()
eq
'DIGEST‐MD5'
 





















or
$_‐>textContent()
eq
'PLAIN') 











when('bind')
.
.
. 











default
.
.
. 



when
('proceed')
.
.
.
 



when
('success')
.
.
. POE::Component::Jabber
— 22 Mar 2009 A POE Component for communicating over Jabber
  69. 69. for and when
  70. 70. for
(
catch
)
{ 

when
(
$_‐>isa('Getopt::Lucid::Exception::ARGV')
)
{ 



say; 



#
usage
stuff 



return
1; 

} 

default
{
die
$_
} } App::CPAN::Mini::Visit
— 07 Nov 2008 explore each distribution in a minicpan repository
  71. 71. ~~
  72. 72. return
_fail(
$pkg,
$sub
)
if
$_
~~
0; if
(
$attr
~~
/^Export_?Lexical$/i
)
{ Export::Lexical
— 09 Oct 2008 Lexically scoped subroutine imports
  73. 73. @exportz



=
grep
{
!
(
$_
~~
@argz
)
}
@_; $disp
~~
@exportz
 







or
push
@exportz,
$disp; Exporter::Proxy
— 29 Jan 2010 Simplified symbol export & proxy dispatch
  74. 74. @exportz



=
grep
{
!
(
$_
~~
@argz
)
}
@_; $disp
~~
@exportz
 







or
push
@exportz,
$disp; Cool? Exporter::Proxy
— 29 Jan 2010 Simplified symbol export & proxy dispatch
  75. 75. $disp
~~
@exportz
 







or
push
@exportz,
$disp; push
@exportz,
$disp
unless
$disp
~~
@exportz
  76. 76. for(
@_
) 



{ 







index
$_,
':' 







or
next; 







if(
$_
~~
@exportz
) 







{ 











my
$source

=
qualify_to_ref
$_,
$source; 











my
$install
=
qualify_to_ref
$_,
$caller; 











*$install


=
*$source; 







} 







else 







{ 











die
"Bogus
$source:
'$_'
not
exported"; 







} 



} Exporter::Proxy
— 29 Jan 2010 Simplified symbol export & proxy dispatch
  77. 77. for(
@_
) 



{ 







index
$_,
':' 







or
next; Maybe when? 







if(
$_
~~
@exportz
) 







{ 











my
$source

=
qualify_to_ref
$_,
$source; 











my
$install
=
qualify_to_ref
$_,
$caller; 











*$install


=
*$source; 







} 







else 







{ 











die
"Bogus
$source:
'$_'
not
exported"; 







} 



} Exporter::Proxy
— 29 Jan 2010 Simplified symbol export & proxy dispatch
  78. 78. 48 files, and only single one (Maplat::Helpers::CommandHelper) uses 5.10 feature Maplat Maplat::Web::Login Maplat::Helpers::BuildNum Maplat::Web::LogoCache Maplat::Helpers::CSVFilter Maplat::Web::MemCache Maplat::Helpers::Cache::Memcached Maplat::Web::MemCacheSim Maplat::Helpers::Cache::Memcached::GetParser Maplat::Web::PathRedirection Maplat::Helpers::CommandHelper Maplat::Web::PostgresDB Maplat::Helpers::DBSerialize Maplat::Web::SendMail Maplat::Helpers::DateStrings Maplat::Web::SessionSettings Maplat::Helpers::Logo Maplat::Web::StandardFields Maplat::Helpers::MailLogger Maplat::Web::StaticCache Maplat::Helpers::Mascot Maplat::Web::Status Maplat::Helpers::Padding Maplat::Web::TemplateCache Maplat::Helpers::Strings Maplat::Web::UserSettings Maplat::Helpers::TextLogger Maplat::Web::VariablesADM Maplat::Web Maplat::Worker Maplat::Web::BaseModule Maplat::Worker::AdminCommands Maplat::Web::BrowserWorkarounds Maplat::Worker::BaseModule Maplat::Web::CommandQueue Maplat::Worker::Commands Maplat::Web::Debuglog Maplat::Worker::DirCleaner Maplat::Web::DirCleaner Maplat::Worker::MemCache Maplat::Web::DocsSearch Maplat::Worker::OracleDB Maplat::Web::DocsSpreadSheet Maplat::Worker::PostgresDB Maplat::Web::DocsWordProcessor Maplat::Worker::Reporting Maplat::Web::Errors Maplat::Worker::SendMail Maplat
— 20 Jan 2010 The MAPLAT Web Framework This Module is actually a stub (don't use it)
  79. 79. 48 files, and only single one (Maplat::Helpers::CommandHelper) uses 5.10 feature if($line‐>{id}
~~
%active)
 Maplat
— 20 Jan 2010 The MAPLAT Web Framework This Module is actually a stub (don't use it)
  80. 80. Named capturing parens
  81. 81. 




my
$compiled_regex
=
qr{ 








G 








(?<mArPa_prefix>$prefix) 








(?<mArPa_match>$regex) 








(?<mArPa_suffix>$suffix) 




}xms; Parse::Marpa::Recognizer
  82. 82. Part IV Antipatterns
  83. 83. use
5.010; use
feature
':5.10'; App::TemplateServer
  84. 84. 


$show_line
//=
1
 






if
$style
eq
'Regexp::Common'; SmartMatch::Sugar Regexp-CharClasses
  85. 85. use
Switch; switch($stream‐>codec_type){ 
 
 
 case
"video"
{ 
 
 
 
 bless
$stream,
'Video::FFmpeg::AVStream::Video'; 
 
 
 
 push
@streams,
$stream; 
 
 
 } 
 
 
 case
"audio"
{ 
 
 
 
 bless
$stream,
'Video::FFmpeg::AVStream::Audio'; 
 
 
 
 push
@streams,
$stream; 
 
 
 } 
 
 
 case
"subtitle"
{ 
 
 
 
 bless
$stream,
'Video::FFmpeg::AVStream::Subtitle'; 
 
 
 
 push
@streams,
$stream; 
 
 
 } 
 
 
 else
{ 
 
 
 
 push
@streams,
$stream; 
 
 
 } 
 
 } use
if
$]
>=
5.011,
'deprecate'; Video::FFmpeg::AVFormat
  86. 86. my
$prefix
=
$symbol_prefix
//
$default_prefix; $prefix
=
qr/$prefix/xms
if
defined
$prefix; my
$suffix
=
$symbol_suffix
//
$default_suffix; $suffix
=
qr/$suffix/xms
if
defined
$suffix; Parse::Marpa::Recognizer
  87. 87. $isPermaLink
=
 


(lc($guid‐>att('isPermaLink')
//
'true')
 


eq
'true'); App::RSS2Leafnode
— 02 Feb 2010 post RSS feeds to newsgroups
  88. 88. $isPermaLink
=
 


(lc($guid‐>att('isPermaLink')
//
'true')
 


eq
'true'); say
'False'
if
length($bool_value)
==
5;
  89. 89. given
(
$params[0]
//
''
)
{ 



when
(blessed
$_
&&
$_‐>isa('Math::BigInt'))
{ 







$bit
=
$class‐>string2bit(shift(@params)‐>as_bin()); 



} 



when
(m/^d+$/)
{ 







$bit
=
$class‐>int2bit(shift(@params)); 



} 



when
(m/^0[bB][01]+$/)
{ 







$bit
=
$class‐>string2bit(shift(@params)); 



} 



when
(m/^[$ZERO$ONE]+$/)
{ 







$bit
=
$class‐>bit2bit(shift(@params)); 



} Bitmask::Data
— 03 Oct 2008 Handle unlimited length bitmasks in an easy and flexible way
  90. 90. while
(
my
(
$option,
$value
)
=
each
%{$args}
)
{ 




given
($option)
{ 








when
('rules')
{ 








when
('terminals')
{ 








when
('trace_predefineds')
{ 








when
('start')
{ 








when
('trace_iterations')
{ 








when
('academic')
{ 








when
('trace_priorities')
{ 








when
('default_null_value')
{ 








when
('trace_completions')
{ 








when
('default_action')
{ 








when
('location_callback')
{ 








when
('default_lex_prefix')
{ 








when
('opaque')
{ 








when
('default_lex_suffix')
{ 








when
('cycle_action')
{ 








when
('ambiguous_lex')
{ 








when
('cycle_depth')
{ 








when
('strip')
{ 








when
('warnings')
{ 








when
('trace_file_handle')
{ 








when
('code_lines')
{ 








when
('trace_actions')
{ 








when
('allow_raw_source')
{ 








when
('trace_lex')
{ 








when
('max_parses')
{ 








when
('trace_lex_tries')
{ 








when
('version')
{ 








when
('trace_lex_matches')
{ 








when
('semantics')
{ 








when
('trace_values')
{ 








when
('lex_preamble')
{ 








when
('trace_rules')
{ 








when
('preamble')
{ 








when
('trace_strings')
{ 








default
{ Parse::Marpa::Internal
  91. 91. my
$attrz 










=
local
$que‐>{
attrib
} 










=
$job2attrz{
$job_id
} 










//=
$que‐>merge_attrib(
$job_id
) 










; Parallel::Depend
— 12 Aug 2009 Parallel-dependent dispatch of perl or shell code
  92. 92. foreach
my
$shipment
(@{$response‐>shipment})
{ 



say
".==========================================."; 



say
"|
Shipment
$count

























|"; 



say
$shipment‐>serialize‐>draw; 



say
""; 



if
($self‐>verbose)
{ 







say
$shipment‐>xml‐>toString(1); 



} 



$count
++; } Parallel::Depend
— 12 Aug 2009 Parallel-dependent dispatch of perl or shell code
  93. 93. use
5.010000; print
"n"; print
"
chaptersn"; DVD::Read
— 16 Nov 2008 libdvdread perl binding
  94. 94. do_something()
//
return
NOT_FOUND;
  95. 95. do_something()
//
return
NOT_FOUND; is_leap_year()
 



?
($n
=
366)
 



:
($n
=
365) 



;
  96. 96. Part V Use cases
  97. 97. Part V Use cases and what to care about
  98. 98. How to enable
  99. 99. use
v5.10; use
Modern::Perl; use
common::sense;
  100. 100. use
feature
':5.10.1'; use
feature
':5.10';
  101. 101. use
feature
':5.10.1'; use
feature
':5.10'; 5.10 reads entire string
  102. 102. use
feature
':5.10.1'; use
feature
':5.10'; 5.10 reads entire string use
feature
':5.10.1'; use
feature
':5.10'; 5.10.1 — first two parts only
  103. 103. use
feature
':5.10.1'; use
feature
':5.10'; 5.10 reads entire string use
feature
':5.10.1'; use
feature
':5.10'; 5.10.1 — first two parts only use
feature
':5.10.7';
  104. 104. use
everywhere
q(feature
':5.10'); use
MyModule; MyModule‐>my_sub($$);
  105. 105. use
everywhere
q(feature
':5.10'); use
MyModule; MyModule‐>my_sub($$); package
MyModule; sub
my_sub
{ 



say
$_[1]; } 1;
  106. 106. >
perl
‐E
"say
$$;"
  107. 107. ~~ to check if something is in the list
  108. 108. if
($last_name
~~
@attendees)
{...}
  109. 109. ~~ to compare arrays
  110. 110. my
@a
=
(1,
3,
5); my
@b
=
(1,
3,
5); say
@a
~~
@b;
#
1
  111. 111. my
@a
=
(1,
3,





5); my
@b
=
(1,
qr/d/,
5); say
@a
~~
@b;
#
1 Note, this is not element by element comparision
  112. 112. my
@a
=
(1,
3,





5); my
@b
=
(1,
qr/d/,
5); say
@a
~~
@b;
#
1 Note, this is element by element matching
  113. 113. ~~ to check command line arguments
  114. 114. %
./some_programme
‐‐debug
‐d
  115. 115. %
./some_programme
‐‐debug
‐d say
'Debug'

if
'‐‐debug'
~~
@ARGV; say
'Daemon'
if
'‐d'
~~
@ARGV;
  116. 116. %
./some_programme
‐‐debug
‐d say
'Debug'

if
'‐‐debug'
~~
@ARGV; say
'Daemon'
if
'‐d'
~~
@ARGV; say
'Help'
 



if
/^(‐h|‐‐help)$/
~~
@ARGV;
  117. 117. Chained //
  118. 118. my
$ip
=
 



$ENV{X_HTTP_FORWARDED_FOR}
// 



$ENV{HTTP_X_REAL_IP}






// 



$ENV{REMOTE_ADDR};
  119. 119. my
$ip
=
 



$page‐>param('request_ip')
// 



$ENV{X_HTTP_FORWARDED_FOR}
// 



$ENV{HTTP_X_REAL_IP}






// 



$ENV{REMOTE_ADDR}; Easy to update
  120. 120. my
$ip
=
 



$ENV{HTTP_X_REAL_IP}






// 



$page‐>param('request_ip')
// 



$ENV{X_HTTP_FORWARDED_FOR}
// 



$ENV{REMOTE_ADDR}; Easy order control
  121. 121. state for counters
  122. 122. sub
count
{ 



state
$c; 



return
++$c; } say
count();
#
1 say
count();
#
2
  123. 123. state
$count; unless
($count)
{ 



#
SQL‐query
select
count(*)
... } my
$offset
=
int
rand
$count; #
SQL‐query
 #
select
...
limit
$offset,
1
  124. 124. for and when
  125. 125. use
v5.10; my
@array
=
(1..20); my
$count
=
0; for(@array)
{ 



when(/[02468]$/)
{ 







$count++; 



} 



say; } say
$count;
  126. 126. use
v5.10; my
@array
=
(1..20); my
$count
=
0; for(@array)
{ 



when(/[02468]$/)
{ 







$count++; 



} 



say; } say
$count;

#
10
  127. 127. use
v5.10; my
@array
=
(1..20); my
$count
=
0; for(@array)
{ 



when(/[02468]$/)
{ 







$count++; 



} 



say; } say
$count;

#
10
  128. 128. 1 use
v5.10; 3 my
@array
=
(1..20); my
$count
=
0; 5 for(@array)
{ 7 



when(/[02468]$/)
{ 9 







$count++; 11 



} 13 



say; 15 } 17 say
$count;

#
10 19
  129. 129. use
v5.10; my
@array
=
(1..20); my
$count
=
0; for(@array)
{ 



when(/[02468]$/)
{ 







$count++;
continue; 



} 



say; } say
$count;

#
10
  130. 130. >
perl5.10
‐E
 

"say
for
1..3" >
perl6
‐e
 

"say
for
1..3"
  131. 131. >
perl5.10
‐E
 1 

"say
for
1..3" 2 3 >
perl6
‐e
 n 

"say
for
1..3" n n
  132. 132. More A number of fascinating and useful regex features
  133. 133. Part V.X __END__ Andrew Shitov andy@shitov.ru talks.shitov.ru

×