SlideShare a Scribd company logo
1 of 131
Download to read offline
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.10';
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 $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
// и //=
для значений по умолчанию
$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 $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
// внутри 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
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 внутри //
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
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(
// non_empty ($channel->first_child_

 # RFC822
 // 'nobody@'.$self->uri_to_host
);
Несколько //
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 со скаляром
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 для выбора варианта
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
с булевым выражением
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
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
when
с регулярным выражением
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 и ref
given(ref $fdef){
      when('ARRAY'){




Package::FromData — 14 Jan 2008
generate a package with methods and variables from a data structure
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_quote
   when ('lex_q_quote') {
     $lexers[$ix] =
        [ &Parse::Marpa::Lex::lex_q_quote,
           $prefix, $suffix ];
   }



Parse::Marpa::Recognizer
Вложенные 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
for и 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
$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::Marpa::Recognizer
Часть 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::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
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;
}

   
   
   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 to newsgroups
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
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
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
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|--help)$/ ~~ @ARGV;
Цепочка //
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};



           Легко обновлять
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 ... limit $offset, 1
for и 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
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

More Related Content

What's hot

Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelOleg Poludnenko
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобовLidiya Myalkina
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Fwdays
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Entity. Anton Shubkin and Yaroslav Ponomarev
Entity. Anton Shubkin and Yaroslav PonomarevEntity. Anton Shubkin and Yaroslav Ponomarev
Entity. Anton Shubkin and Yaroslav PonomarevADCI Solutions
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 

What's hot (20)

Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Javascript
JavascriptJavascript
Javascript
 
Entity. Anton Shubkin and Yaroslav Ponomarev
Entity. Anton Shubkin and Yaroslav PonomarevEntity. Anton Shubkin and Yaroslav Ponomarev
Entity. Anton Shubkin and Yaroslav Ponomarev
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 

Similar to Perl 5.10 и 5.12

Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Stepan Tanasiychuk
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массивAndrew Shitov
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoDrupalCampDN
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
Юрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderЮрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderPositive Hack Days
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 

Similar to Perl 5.10 и 5.12 (20)

DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Yserver
YserverYserver
Yserver
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Render API.
Render API.Render API.
Render API.
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Юрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис ColliderЮрий Гольцев - Сервис Collider
Юрий Гольцев - Сервис Collider
 
Collider
ColliderCollider
Collider
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 

More from Andrew Shitov

Creating a compiler in Perl 6
Creating a compiler in Perl 6Creating a compiler in Perl 6
Creating a compiler in Perl 6Andrew Shitov
 
Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Andrew Shitov
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Andrew Shitov
 
Perl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingPerl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingAndrew Shitov
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of SmartmatchAndrew Shitov
 
Perl 7, the story of
Perl 7, the story ofPerl 7, the story of
Perl 7, the story ofAndrew Shitov
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
What's new in Perl 5.14
What's new in Perl 5.14What's new in Perl 5.14
What's new in Perl 5.14Andrew Shitov
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14Andrew Shitov
 
Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Andrew Shitov
 
There's more than one way to empty it
There's more than one way to empty itThere's more than one way to empty it
There's more than one way to empty itAndrew Shitov
 
How to clean an array
How to clean an arrayHow to clean an array
How to clean an arrayAndrew Shitov
 
Say Perl на весь мир
Say Perl на весь мирSay Perl на весь мир
Say Perl на весь мирAndrew Shitov
 
Personal Perl 6 compiler
Personal Perl 6 compilerPersonal Perl 6 compiler
Personal Perl 6 compilerAndrew Shitov
 

More from Andrew Shitov (20)

Perl6 one-liners
Perl6 one-linersPerl6 one-liners
Perl6 one-liners
 
Creating a compiler in Perl 6
Creating a compiler in Perl 6Creating a compiler in Perl 6
Creating a compiler in Perl 6
 
Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
AllPerlBooks.com
AllPerlBooks.comAllPerlBooks.com
AllPerlBooks.com
 
Perl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingPerl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel Computing
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
 
YAPC::Europe 2013
YAPC::Europe 2013YAPC::Europe 2013
YAPC::Europe 2013
 
Perl 7, the story of
Perl 7, the story ofPerl 7, the story of
Perl 7, the story of
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
What's new in Perl 5.14
What's new in Perl 5.14What's new in Perl 5.14
What's new in Perl 5.14
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 
Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6
 
There's more than one way to empty it
There's more than one way to empty itThere's more than one way to empty it
There's more than one way to empty it
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
 
How to clean an array
How to clean an arrayHow to clean an array
How to clean an array
 
Say Perl на весь мир
Say Perl на весь мирSay Perl на весь мир
Say Perl на весь мир
 
Personal Perl 6 compiler
Personal Perl 6 compilerPersonal Perl 6 compiler
Personal Perl 6 compiler
 

Perl 5.10 и 5.12

  • 1. Perl 5.10 и 5.12 за 30 минут
  • 3. 5.6.0 — 22 марта 2000
  • 4. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006
  • 5. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007
  • 6. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010
  • 7. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010 6.0 — ?
  • 8. 5.6.0 — 22 марта 2000 5.8.8 — 31 января 2006 5.10.0 — 18 декабря 2007 5.12.0 — 12 апреля 2010 6.0 — ?
  • 9. «Глупо бросать девушку, которая стала еще красивее, умнее, стала следить за собой и ходить в солярий» Анатолий Шарифулин
  • 10.
  • 11.
  • 12. Всего на CPAN ~80 000 модулей
  • 13. Всего на CPAN ~20 000 дистрибутивов
  • 14. Всего на CPAN ~8000 авторов
  • 15. Всего на CPAN ~8000 авторов ~4800 активных
  • 17. ?
  • 22. say say $x == print "$xn"
  • 23. ~~ $a ~~ /d/ $a ~~ @list @list ~~ %hash
  • 24. switch given($x) { when(/a/) {...} when('b') {...} default {...} }
  • 25. state sub counter { state $c = 0; return ++$c; }
  • 26. regexes (?<name>) %+ K %- R g<name>
  • 27. // $city = $arg // 'Moscow'; $vacancy{city} //= 'Moscow';
  • 28. Кроме того Много интересных новых возможностей регулярных выражений
  • 31. ... (Yada Yada) sub planned_functionality { ... }
  • 33. each @a while (($a, $b) = each @a)
  • 34. {} when say $result when $ready;
  • 37. 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';
  • 38. 5.10.0 v5.10.0 v5.10 vector string version string сокращенно — v-string
  • 39.
  • 41. 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
  • 42. // и //= для значений по умолчанию
  • 43. $port //= 5432; $host //= 'localhost'; $col //= ''; Pg::Loader — 07 Jul 2008 Perl extension for loading Postgres tables
  • 44. $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
  • 45. 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
  • 46. say $answer // "I don't know enough to answer you yet."; Hailo — 29 Jan 2010 A pluggable Markov engine analogous to MegaHAL
  • 47. 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
  • 48. 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
  • 50. 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
  • 51. 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
  • 53. 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
  • 54. 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
  • 55. 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(
  • 56. // non_empty ($channel->first_child_ # RFC822 // 'nobody@'.$self->uri_to_host );
  • 58. 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
  • 60. 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
  • 61. 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
  • 62. when для выбора варианта
  • 63. 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
  • 64. 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
  • 66. 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
  • 67. 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
  • 69. 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
  • 71. given(ref $fdef){ when('ARRAY'){ Package::FromData — 14 Jan 2008 generate a package with methods and variables from a data structure
  • 73. given ($1) { when (undef) {return} when ($left) { $depth++; } when ($right) { $depth--; } } Parse::Marpa::Lex
  • 74. 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
  • 76. 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
  • 78. 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
  • 79. ~~
  • 80. return _fail( $pkg, $sub ) if $_ ~~ 0; if ( $attr ~~ /^Export_?Lexical$/i ) { Export::Lexical — 09 Oct 2008 Lexically scoped subroutine imports
  • 81. @exportz = grep { ! ( $_ ~~ @argz ) } @_; $disp ~~ @exportz or push @exportz, $disp; Exporter::Proxy — 29 Jan 2010 Simplified symbol export & proxy dispatch
  • 82. $disp ~~ @exportz or push @exportz, $disp; push @exportz, $disp unless $disp ~~ @exportz
  • 84. my $compiled_regex = qr{ G (?<mArPa_prefix>$prefix) (?<mArPa_match>$regex) (?<mArPa_suffix>$suffix) }xms; Parse::Marpa::Recognizer
  • 86. use 5.010; use feature ':5.10'; App::TemplateServer
  • 87. $show_line //= 1 if $style eq 'Regexp::Common'; SmartMatch::Sugar Regexp-CharClasses
  • 88. 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
  • 89. 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;
  • 90. } else { push @streams, $stream; } } use if $] >= 5.011, 'deprecate';
  • 91. $isPermaLink = (lc($guid->att('isPermaLink') // 'true') eq 'true'); App::RSS2Leafnode — 02 Feb 2010 post RSS feeds to newsgroups
  • 92. 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
  • 93. 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
  • 94. 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
  • 95. use 5.010000; print "n"; print " chaptersn"; DVD::Read — 16 Nov 2008 libdvdread perl binding
  • 97. do_something() // return NOT_FOUND; is_leap_year() ? ($n = 366) : ($n = 365) ;
  • 99. Часть VI Где применить и как не наступить на грабли
  • 102. use v5.10; vs. use v5.12; use strict;
  • 103. use v5.10; vs. use v5.12; use strict;
  • 104. > perl -E "say $$;"
  • 106. if ($last_name ~~ @attendees) {...}
  • 107. ~~ для сравнения списков
  • 108. my @a = (1, 3, 5); my @b = (1, 3, 5); say @a ~~ @b; # 1
  • 109. my @a = (1, 3, 5); my @b = (1, qr/d/, 5); say @a ~~ @b; # 1 Осторожно, это не поэлементное сравнение
  • 110. ~~ для проверки аргументов
  • 112. % ./some_programme --debug -d say 'Debug' if '--debug' ~~ @ARGV; say 'Daemon' if '-d' ~~ @ARGV;
  • 113. % ./some_programme --debug -d say 'Debug' if '--debug' ~~ @ARGV; say 'Daemon' if '-d' ~~ @ARGV; say 'Help' if /^(-h|--help)$/ ~~ @ARGV;
  • 115. my $ip =     $ENV{X_HTTP_FORWARDED_FOR} //     $ENV{HTTP_X_REAL_IP}       //     $ENV{REMOTE_ADDR};
  • 116. my $ip =     $page->param('request_ip') // $ENV{X_HTTP_FORWARDED_FOR} //     $ENV{HTTP_X_REAL_IP}       //     $ENV{REMOTE_ADDR}; Легко обновлять
  • 118. sub count { state $c; return ++$c; } say count(); # 1 say count(); # 2
  • 119. state $count; unless ($count) {     # SQL-запрос select count(*) } my $offset = int rand $count; # SQL-запрос # select ... limit $offset, 1
  • 121. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count;
  • 122. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count; # 10
  • 123. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; }     say; } say $count; # 10
  • 124. 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
  • 125. use v5.10; my @array = (1..20); my $count = 0; for(@array) {     when(/[02468]$/) { $count++; continue; }     say; } say $count; # 10
  • 126. use v5.12; for ('a'..'z', 'A', 'Z') { say when /[aeiou]/i; }
  • 127. use v5.12; $string =~ /(.+)/s; $string =~ /(N+)/;
  • 128. > perl5.10 -E "say for 1..3" > perl6 -e "say for 1..3"
  • 129. > perl5.10 -E 1 "say for 1..3" 2 3 > perl6 -e n "say for 1..3" n n
  • 130. Кроме того Много интересных новых возможностей регулярных выражений