SlideShare a Scribd company logo
Perl 5.10
 in 2010
Part I
The History
and some
Statistics
5.10.0
18 December 2007
Today is
5 March 2010
Perl 5.10 in 2010
810 days
 passed
Perl 5.10 in 2010
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 implementations in March 2010

Jonathan Worthington
Solved in 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
Perl 5.10 in 2010
say for debugging
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
// and //=
for default values
$port
//=

5432;
$host
//=
'localhost';

$col

//=
'';




Pg::Loader — 07 Jul 2008
Perl extension for loading Postgres tables
$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
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
say
$answer
//





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




Hailo — 29 Jan 2010
A pluggable Markov engine analogous to MegaHAL
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
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
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
// inside return
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
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
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
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
return
inside //
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
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
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
Chained
//



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
when with a scalar




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




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
when for selection
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
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
when
with a boolean value
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
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
when
with regular expressions
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
when and ref




given(ref
$fdef){








when('ARRAY'){




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




when
(undef)

{return}




when
($left)

{
$depth++;
}




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




Parse::Marpa::Lex
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
Nested given/when
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
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
for and when
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
~~
return
_fail(
$pkg,
$sub
)
if
$_
~~
0;



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




Export::Lexical
— 09 Oct 2008
Lexically scoped subroutine imports
@exportz



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



$disp
~~
@exportz









or
push
@exportz,
$disp;




Exporter::Proxy
— 29 Jan 2010
Simplified symbol export & proxy dispatch
@exportz



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



$disp
~~
@exportz









or
push
@exportz,
$disp;
                                           Cool?




Exporter::Proxy
— 29 Jan 2010
Simplified symbol export & proxy dispatch
$disp
~~
@exportz









or
push
@exportz,
$disp;




push
@exportz,
$disp
unless
$disp
~~
@exportz
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
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
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)
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)
Named capturing parens





my
$compiled_regex
=
qr{









G









(?<mArPa_prefix>$prefix)









(?<mArPa_match>$regex)









(?<mArPa_suffix>$suffix)





}xms;




 Parse::Marpa::Recognizer
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';
 
 
 
 
 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
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
$isPermaLink
=




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




eq
'true');




App::RSS2Leafnode
— 02 Feb 2010
post RSS feeds to newsgroups
$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(@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
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
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
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
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.10';

           5.10.1 — first two parts only
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';
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];
}
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
     element by element comparision
my
@a
=
(1,
3,





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




               Note, this
                  is
      element by element matching
~~ 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
/^(‐h|‐‐help)$/
~~
@ARGV;
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{REMOTE_ADDR};



         Easy to update
my
$ip
=





$ENV{HTTP_X_REAL_IP}






//




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




$ENV{X_HTTP_FORWARDED_FOR}
//




$ENV{REMOTE_ADDR};



       Easy order control
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

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




when(/[02468]$/)
{








$count++;




}




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




when(/[02468]$/)
{








$count++;




}




say;
}
say
$count;

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




when(/[02468]$/)
{








$count++;




}




say;
}
say
$count;

#
10
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
use
v5.10;
my
@array
=
(1..20);
my
$count
=
0;
for(@array)
{




when(/[02468]$/)
{








$count++;
continue;




}




say;
}
say
$count;

#
10
>
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
                   n
More

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


Andrew Shitov
andy@shitov.ru   talks.shitov.ru

More Related Content

PDF
Php 7 compliance workshop singapore
PDF
Yapc::NA::2009 - Command Line Perl
ODP
Incredible Machine with Pipelines and Generators
PPT
Perl Intro 4 Debugger
PDF
PHP 5.3/6
PDF
Java Full Throttle
PDF
PHP7 is coming
Php 7 compliance workshop singapore
Yapc::NA::2009 - Command Line Perl
Incredible Machine with Pipelines and Generators
Perl Intro 4 Debugger
PHP 5.3/6
Java Full Throttle
PHP7 is coming

What's hot (19)

PPTX
PHP 5.3
PDF
C++ for Java Developers (JavaZone 2017)
PDF
Loops and Unicorns - The Future of the Puppet Language - PuppetConf 2013
DOCX
Perl 20tips
PDF
PHP traits, treat or threat?
PDF
Java Keeps Throttling Up!
PDF
2021.laravelconf.tw.slides2
PDF
Scala parsers Error Recovery in Production
ODP
Mastering Namespaces in PHP
ODP
Perl Moderno
PPTX
Peek at PHP 7
ODP
What's new in Perl 5.10?
PDF
Modern Perl for the Unfrozen Paleolithic Perl Programmer
PDF
effective_r27
PPTX
How Functions Work
ODP
The promise of asynchronous PHP
PDF
Damien seguy php 5.6
PDF
CLI, the other SAPI
PDF
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
PHP 5.3
C++ for Java Developers (JavaZone 2017)
Loops and Unicorns - The Future of the Puppet Language - PuppetConf 2013
Perl 20tips
PHP traits, treat or threat?
Java Keeps Throttling Up!
2021.laravelconf.tw.slides2
Scala parsers Error Recovery in Production
Mastering Namespaces in PHP
Perl Moderno
Peek at PHP 7
What's new in Perl 5.10?
Modern Perl for the Unfrozen Paleolithic Perl Programmer
effective_r27
How Functions Work
The promise of asynchronous PHP
Damien seguy php 5.6
CLI, the other SAPI
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Ad

Similar to Perl 5.10 in 2010 (20)

ODP
Introduction to Modern Perl
ODP
Advanced Perl Techniques
PPT
PHP Workshop Notes
ODP
Whatsnew in-perl
PDF
DevOps in PHP environment
PPT
Introduction to PHP
PDF
What's new in Perl 5.14
PPT
Php Reusing Code And Writing Functions
PPTX
Introducing PHP Latest Updates
PDF
Introduction to PHP
PPTX
PDF
Perl 5.10
ODP
PHP: The easiest language to learn.
PPT
PPT
Perl Tidy Perl Critic
PDF
Good Evils In Perl
PDF
SymfonyCon 2017 php7 performances
PPT
Dealing with Legacy Perl Code - Peter Scott
PDF
Giới thiệu PHP 7
PPTX
Flying under the radar
Introduction to Modern Perl
Advanced Perl Techniques
PHP Workshop Notes
Whatsnew in-perl
DevOps in PHP environment
Introduction to PHP
What's new in Perl 5.14
Php Reusing Code And Writing Functions
Introducing PHP Latest Updates
Introduction to PHP
Perl 5.10
PHP: The easiest language to learn.
Perl Tidy Perl Critic
Good Evils In Perl
SymfonyCon 2017 php7 performances
Dealing with Legacy Perl Code - Peter Scott
Giới thiệu PHP 7
Flying under the radar
Ad

More from Andrew Shitov (20)

PDF
Perl jobs market in 2024, how good is it?
PDF
Perl6 one-liners
PDF
Creating a compiler in Perl 6
PPTX
Fun with Raspberry PI (and Perl)
PDF
Perl6 in-production
PDF
Параллельные вычисления в Perl 6
PDF
AllPerlBooks.com
PDF
Perl 6 for Concurrency and Parallel Computing
PDF
The Joy of Smartmatch
PDF
YAPC::Europe 2013
PDF
Perl 7, the story of
PDF
Язык программирования Go для Perl-программистов
PDF
Как очистить массив
PDF
Что нового в Perl 5.14
PDF
Perl6 grammars
PDF
Text in search queries with examples in Perl 6
PDF
There's more than one way to empty it
PDF
Perl 6 by example
PDF
How to clean an array
PDF
Perl 5.10 и 5.12
Perl jobs market in 2024, how good is it?
Perl6 one-liners
Creating a compiler in Perl 6
Fun with Raspberry PI (and Perl)
Perl6 in-production
Параллельные вычисления в Perl 6
AllPerlBooks.com
Perl 6 for Concurrency and Parallel Computing
The Joy of Smartmatch
YAPC::Europe 2013
Perl 7, the story of
Язык программирования Go для Perl-программистов
Как очистить массив
Что нового в Perl 5.14
Perl6 grammars
Text in search queries with examples in Perl 6
There's more than one way to empty it
Perl 6 by example
How to clean an array
Perl 5.10 и 5.12

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Cloud computing and distributed systems.
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPT
Teaching material agriculture food technology
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Approach and Philosophy of On baking technology
PDF
Machine learning based COVID-19 study performance prediction
Spectral efficient network and resource selection model in 5G networks
The Rise and Fall of 3GPP – Time for a Sabbatical?
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Review of recent advances in non-invasive hemoglobin estimation
Cloud computing and distributed systems.
Digital-Transformation-Roadmap-for-Companies.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Teaching material agriculture food technology
Per capita expenditure prediction using model stacking based on satellite ima...
Building Integrated photovoltaic BIPV_UPV.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
“AI and Expert System Decision Support & Business Intelligence Systems”
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Unlocking AI with Model Context Protocol (MCP)
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
The AUB Centre for AI in Media Proposal.docx
Understanding_Digital_Forensics_Presentation.pptx
Approach and Philosophy of On baking technology
Machine learning based COVID-19 study performance prediction

Perl 5.10 in 2010