Perl 5.10
   и 5.12
за 30 минут
Часть I
Краткая история
5.6.0 — 22 марта 2000
5.6.0 — 22 марта 2000
5.8.8 — 31 января 2006
5.6.0 — 22 марта 2000
5.8.8 — 31 января 2006
5.10.0 — 18 декабря 2007
5.6.0 — 22 марта 2000
5.8.8 — 31 января 2006
5.10.0 — 18 декабря 2007
5.12.0 — 12 апреля 2010
5.6.0 — 22 марта 2000
5.8.8 — 31 января 2006
5.10.0 — 18 декабря 2007
5.12.0 — 12 апреля 2010

6.0 — ?
5.6.0 — 22 марта 2000
5.8.8 — 31 января 2006
5.10.0 — 18 декабря 2007
5.12.0 — 12 апреля 2010

6.0 — ?
«Глупо бросать девушку,
которая стала еще красивее,
умнее, стала следить за собой
и ходить в солярий»

             Анатол...
Всего на CPAN
 ~80 000 модулей
Всего на CPAN
~20 000 дистрибутивов
Всего на CPAN
 ~8000 авторов
Всего на CPAN
 ~8000 авторов
 ~4800 активных
Как часто
 используют
фичи Perl 5.10?
?
Пошел третий год
~ 200 модулей
используют 5.10
~ 100 авторов
используют 5.10
Часть II
Фичи Perl 5.10
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';
Кроме того

  Много интересных
 новых возможностей
регулярных выражений
Часть III
Фичи Perl 5.12
$VERSION

package Earth::Gravity 9.8;


use Earth::Gravity 9.8;
... (Yada Yada)

sub planned_functionality {
    ...
}
N


"abcndef" ~~ /(N+)/;
each @a


while (($a, $b) = each @a)
{} when


say $result when $ready;
Часть IV
Как пишут другие
Как включить
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.1...
5.10.0
         v5.10.0
         v5.10

vector string
version string

сокращенно — v-string
say для отладки
given ($action) {
   when (/^include_cmd:/) {
     my $cmd = $child->content;
     $cmd =~ /^include_cmd:(s*)/;
     my $w...
// и //=
для значений по умолчанию
$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;
$...
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 to ...
my $marpa_version =
  $Parse::Marpa::VERSION // 'undef';
my $source_version =
  $Parse::Marpa::Source::VERSION // 'undef';...
my $trace_fh = $arg_trace_fh // (*STDERR);

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




Parse::Marpa::Recognizer — 14...
// внутри return
return $self->_get_infection( $disease->id ) // 0;

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



return @{ $self->_...
return
  isodate_to_rfc822($date // $self->{'now822'});

return URI::Title::title
   ({ url => ($resp->request->uri // '')...
return внутри //
my $b_time = $self->item_to_timet($b_item)
 // return $a_item;

my $a_time = $self->item_to_timet($a_item)
 // return $b_i...
return (elt_to_email ($item->first_child('author'))
     // elt_to_email ($item ->first_child('dc:creator'))
     // elt_to_...
return (elt_to_email ($item->first_child('au
     // elt_to_email ($item ->first_child(
     // elt_to_email ($item ->first_c...
// non_empty ($channel->first_child_

 # RFC822
 // 'nobody@'.$self->uri_to_host
);
Несколько //
my $captures = $arg {captures}     // [];
my $comment =
    escape $arg {comment} // $name // "";
my $upgrade    = $arg {u...
when со скаляром
while (my ($key, $value) = each %arg) {
   given ($key) {
       when ("tests") {
           $Test -> plan ($value);
     ...
foreach (@hazards) {
   when ($WUMPUS) {
     $self -> lose;
     push @messages => "Oops! Bumped into a Wumpus!";
   }
  ...
when для выбора варианта
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: type =...
when
с булевым выражением
unless ( 'itan' ~~ @list ) {
  given ( length $password ) {
     when ( 16 ) {
        # ok
     }
     when ( $_ < 4 ) {
...
unless ( 'itan' ~~ @list ) {
  given ( length $password ) {
     when ( 16 ) {
        # ok
     }
     when ( $_ < 4 ) {
...
when
с регулярным выражением
sub range2list {

 my $_ = shift;

 given ($_) {

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

 
 when (/^d..d$/o )       ...
when и ref
given(ref $fdef){
      when('ARRAY'){




Package::FromData — 14 Jan 2008
generate a package with methods and variables f...
when и 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_...
Вложенные given/when
given($name) {
   when ('stream:stream') . . .
   when ('challenge') . . .
   when ('failure') . . .
   when ('stream:feat...
for и 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 ...
$disp ~~ @exportz
     or push @exportz, $disp;




push @exportz, $disp unless $disp ~~ @exportz
Именованные
сохраняющие скобки
my $compiled_regex = qr{
  G
  (?<mArPa_prefix>$prefix)
  (?<mArPa_match>$regex)
  (?<mArPa_suffix>$suffix)
}xms;




Parse:...
Часть V
Антипаттерны
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::AVSt...
use Switch;
switch($stream->codec_type){

 
 
 case "video" {

 
 
 
 bless $stream, 'Video::FFmpeg::AVStream

 
 
 
 push...
}

   
   
   else {

   
   
   
 push @streams, $stream;

   
   
   }

   
   }

use if $] >= 5.011, 'deprecate';
$isPermaLink =
  (lc($guid->att('isPermaLink') // 'true')
  eq 'true');




App::RSS2Leafnode — 02 Feb 2010
post RSS feeds...
given ( $params[0] // '' ) {
   when (blessed $_ && $_->isa('Math::BigInt')) {
     $bit = $class->string2bit(shift(@param...
while ( my ( $option, $value ) = each   %{$args} ) {
   given ($option) {
      when ('rules') {                  when   (...
my $attrz
      = local $que->{ attrib }
      = $job2attrz{ $job_id }
      //= $que->merge_attrib( $job_id )
      ;



...
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)
   ;
Часть VI
Где применить
Часть VI
Где применить
и как не наступить на грабли
Как включить
use v5.10;

use Modern::Perl;

use common::sense;
use v5.10;
              vs.   use v5.12;
use strict;
use v5.10;
              vs.   use v5.12;
use strict;
> perl -E "say $$;"
~~ для проверки
вхождения в список
if ($last_name ~~ @attendees) {...}
~~ для сравнения списков
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




Осторожно, это не поэлементное сравнение
~~ для проверки аргументов
% ./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|...
Цепочка //
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{RE...
state для счетчиков
sub count {
    state $c;
    return ++$c;
}


say count(); # 1
say count(); # 2
state $count;
unless ($count) {
    # SQL-запрос select count(*)
}


my $offset = int rand $count;
# SQL-запрос
# select ....
for и 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;
    }
    sa...
use v5.12;


for ('a'..'z', 'A', 'Z') {
   say when /[aeiou]/i;
}
use v5.12;


$string =~ /(.+)/s;


$string =~ /(N+)/;
> 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
Кроме того

  Много интересных
 новых возможностей
регулярных выражений
__END__



Андрей Шитов
andy@shitov.ru   talks.shitov.ru
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Upcoming SlideShare
Loading in...5
×

Perl 5.10 и 5.12

3,753

Published on

О новых возможностях, появившихся в свежих версиях Perl.

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

  • Be the first to like this

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

No notes for slide

Transcript of "Perl 5.10 и 5.12"

  1. 1. Perl 5.10 и 5.12 за 30 минут
  2. 2. Часть I Краткая история
  3. 3. 5.6.0 — 22 марта 2000
  4. 4. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006
  5. 5. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007
  6. 6. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010
  7. 7. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010 6.0 — ?
  8. 8. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010 6.0 — ?
  9. 9. «Глупо бросать девушку, которая стала еще красивее, умнее, стала следить за собой и ходить в солярий» Анатолий Шарифулин
  10. 10. Всего на CPAN ~80 000 модулей
  11. 11. Всего на CPAN ~20 000 дистрибутивов
  12. 12. Всего на CPAN ~8000 авторов
  13. 13. Всего на CPAN ~8000 авторов ~4800 активных
  14. 14. Как часто используют фичи Perl 5.10?
  15. 15. ?
  16. 16. Пошел третий год
  17. 17. ~ 200 модулей используют 5.10
  18. 18. ~ 100 авторов используют 5.10
  19. 19. Часть II Фичи Perl 5.10
  20. 20. say say $x == print "$xn"
  21. 21. ~~ $a ~~ /d/ $a ~~ @list @list ~~ %hash
  22. 22. switch given($x) { when(/a/) {...} when('b') {...} default {...} }
  23. 23. state sub counter { state $c = 0; return ++$c; }
  24. 24. regexes (?<name>) %+ K %- R g<name>
  25. 25. // $city = $arg // 'Moscow'; $vacancy{city} //= 'Moscow';
  26. 26. Кроме того Много интересных новых возможностей регулярных выражений
  27. 27. Часть III Фичи Perl 5.12
  28. 28. $VERSION package Earth::Gravity 9.8; use Earth::Gravity 9.8;
  29. 29. ... (Yada Yada) sub planned_functionality { ... }
  30. 30. N "abcndef" ~~ /(N+)/;
  31. 31. each @a while (($a, $b) = each @a)
  32. 32. {} when say $result when $ready;
  33. 33. Часть IV Как пишут другие
  34. 34. Как включить
  35. 35. 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';
  36. 36. 5.10.0 v5.10.0 v5.10 vector string version string сокращенно — v-string
  37. 37. say для отладки
  38. 38. 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
  39. 39. // и //= для значений по умолчанию
  40. 40. $port //= 5432; $host //= 'localhost'; $col //= ''; Pg::Loader — 07 Jul 2008 Perl extension for loading Postgres tables
  41. 41. $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
  42. 42. 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
  43. 43. say $answer // "I don't know enough to answer you yet."; Hailo — 29 Jan 2010 A pluggable Markov engine analogous to MegaHAL
  44. 44. 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
  45. 45. 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
  46. 46. // внутри return
  47. 47. 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
  48. 48. 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
  49. 49. return внутри //
  50. 50. 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
  51. 51. 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
  52. 52. return (elt_to_email ($item->first_child('au // elt_to_email ($item ->first_child( // elt_to_email ($item ->first_child( // non_empty ($item->first_child_tex // elt_to_email ($channel->first_child // elt_to_email ($channel->first_child // elt_to_email ($channel->first_child // elt_to_email ($channel->first_child // elt_to_email ($item ->first_child(
  53. 53. // non_empty ($channel->first_child_ # RFC822 // 'nobody@'.$self->uri_to_host );
  54. 54. Несколько //
  55. 55. 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
  56. 56. when со скаляром
  57. 57. 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
  58. 58. 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
  59. 59. when для выбора варианта
  60. 60. 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
  61. 61. 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
  62. 62. when с булевым выражением
  63. 63. 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 { ... App::iTan::Utils — 26 Oct 2009 Secure management of iTans for online banking
  64. 64. 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 { ... App::iTan::Utils — 26 Oct 2009 Secure management of iTans for online banking
  65. 65. when с регулярным выражением
  66. 66. 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
  67. 67. when и ref
  68. 68. given(ref $fdef){ when('ARRAY'){ Package::FromData — 14 Jan 2008 generate a package with methods and variables from a data structure
  69. 69. when и undef
  70. 70. given ($1) { when (undef) {return} when ($left) { $depth++; } when ($right) { $depth--; } } Parse::Marpa::Lex
  71. 71. 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
  72. 72. Вложенные given/when
  73. 73. 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
  74. 74. for и when
  75. 75. 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
  76. 76. ~~
  77. 77. return _fail( $pkg, $sub ) if $_ ~~ 0; if ( $attr ~~ /^Export_?Lexical$/i ) { Export::Lexical — 09 Oct 2008 Lexically scoped subroutine imports
  78. 78. @exportz = grep { ! ( $_ ~~ @argz ) } @_; $disp ~~ @exportz or push @exportz, $disp; Exporter::Proxy — 29 Jan 2010 Simplified symbol export & proxy dispatch
  79. 79. $disp ~~ @exportz or push @exportz, $disp; push @exportz, $disp unless $disp ~~ @exportz
  80. 80. Именованные сохраняющие скобки
  81. 81. my $compiled_regex = qr{ G (?<mArPa_prefix>$prefix) (?<mArPa_match>$regex) (?<mArPa_suffix>$suffix) }xms; Parse::Marpa::Recognizer
  82. 82. Часть V Антипаттерны
  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. use Switch; switch($stream->codec_type){ case "video" { bless $stream, 'Video::FFmpeg::AVStream push @streams, $stream; } case "audio" { bless $stream, 'Video::FFmpeg::AVStream push @streams, $stream; } case "subtitle" { bless $stream, 'Video::FFmpeg::AVStream push @streams, $stream;
  87. 87. } else { push @streams, $stream; } } use if $] >= 5.011, 'deprecate';
  88. 88. $isPermaLink = (lc($guid->att('isPermaLink') // 'true') eq 'true'); App::RSS2Leafnode — 02 Feb 2010 post RSS feeds to newsgroups
  89. 89. given ( $params[0] // '' ) { when (blessed $_ && $_->isa('Math::BigInt')) { $bit = $class->string2bit(shift(@params)->a } when (m/^d+$/) { $bit = $class->int2bit(shift(@params)); } when (m/^0[bB][01]+$/) { $bit = $class->string2bit(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 ('trace_predefineds') { when ('terminals') { when ('trace_iterations') { when ('start') { when ('trace_priorities') { when ('academic') { when ('trace_completions') { when ('default_null_value') { when ('location_callback') { when ('default_action') { when ('opaque') { when ('default_lex_prefix') { when ('cycle_action') { when ('default_lex_suffix') { when ('cycle_depth') { when ('ambiguous_lex') { when ('warnings') { when ('strip') { when ('code_lines') { when ('trace_file_handle') { when ('allow_raw_source') { when ('trace_actions') { when ('max_parses') { when ('trace_lex') { when ('version') { when ('trace_lex_tries') { when ('semantics') { when ('trace_lex_matches') { when ('lex_preamble') { 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. use 5.010000; print "n"; print " chaptersn"; DVD::Read — 16 Nov 2008 libdvdread perl binding
  93. 93. do_something() // return NOT_FOUND;
  94. 94. do_something() // return NOT_FOUND; is_leap_year() ? ($n = 366) : ($n = 365) ;
  95. 95. Часть VI Где применить
  96. 96. Часть VI Где применить и как не наступить на грабли
  97. 97. Как включить
  98. 98. use v5.10; use Modern::Perl; use common::sense;
  99. 99. use v5.10; vs. use v5.12; use strict;
  100. 100. use v5.10; vs. use v5.12; use strict;
  101. 101. > perl -E "say $$;"
  102. 102. ~~ для проверки вхождения в список
  103. 103. if ($last_name ~~ @attendees) {...}
  104. 104. ~~ для сравнения списков
  105. 105. my @a = (1, 3, 5); my @b = (1, 3, 5); say @a ~~ @b; # 1
  106. 106. my @a = (1, 3, 5); my @b = (1, qr/d/, 5); say @a ~~ @b; # 1 Осторожно, это не поэлементное сравнение
  107. 107. ~~ для проверки аргументов
  108. 108. % ./some_programme --debug -d
  109. 109. % ./some_programme --debug -d say 'Debug' if '--debug' ~~ @ARGV; say 'Daemon' if '-d' ~~ @ARGV;
  110. 110. % ./some_programme --debug -d say 'Debug' if '--debug' ~~ @ARGV; say 'Daemon' if '-d' ~~ @ARGV; say 'Help' if /^(-h|--help)$/ ~~ @ARGV;
  111. 111. Цепочка //
  112. 112. my $ip =     $ENV{X_HTTP_FORWARDED_FOR} //     $ENV{HTTP_X_REAL_IP}       //     $ENV{REMOTE_ADDR};
  113. 113. my $ip =     $page->param('request_ip') // $ENV{X_HTTP_FORWARDED_FOR} //     $ENV{HTTP_X_REAL_IP}       //     $ENV{REMOTE_ADDR}; Легко обновлять
  114. 114. state для счетчиков
  115. 115. sub count { state $c; return ++$c; } say count(); # 1 say count(); # 2
  116. 116. state $count; unless ($count) {     # SQL-запрос select count(*) } my $offset = int rand $count; # SQL-запрос # select ... limit $offset, 1
  117. 117. for и when
  118. 118. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count;
  119. 119. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count; # 10
  120. 120. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count; # 10
  121. 121. 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
  122. 122. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; continue; }     say; } say $count; # 10
  123. 123. use v5.12; for ('a'..'z', 'A', 'Z') { say when /[aeiou]/i; }
  124. 124. use v5.12; $string =~ /(.+)/s; $string =~ /(N+)/;
  125. 125. > perl5.10 -E "say for 1..3" > perl6 -e "say for 1..3"
  126. 126. > perl5.10 -E 1 "say for 1..3" 2 3 > perl6 -e n "say for 1..3" n n
  127. 127. Кроме того Много интересных новых возможностей регулярных выражений
  128. 128. __END__ Андрей Шитов andy@shitov.ru talks.shitov.ru
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×