Your SlideShare is downloading. ×
0
Что нового в Perl?   5.10 — 5.16      Рикардо Синес    (Ricardo Signes, rjbs)
Perl 5 Что нового?
Perl 5.10Для тех, кто не совсем безумен
Perl 5.12Для использования каждый день
Perl 5.14  Для прагматиков
Perl 5.16Для настоящих программистов
Лексическая семантика!
use feature ‘say’;say “Это тест!”;{    no feature ‘say’;    say “Это ошибка!”;}
use 5.16.0;say “Это тест!”;{    no feature ‘say’;    say “Это ошибка!”;}
#!/usr/bin/perluse strict;use warnings;use 5.16.0; # use feature ‘:5.16’;my $x = Reticulator->new;$x->reticulate( @splines...
#!/usr/bin/perluse strict;use warnings;            # no feature;my $x = Reticulator->new;$x->reticulate( @splines );
#!/usr/bin/perluse strict;use warnings;            # use feature ‘:default’;my $x = Reticulator->new;$x->reticulate( @spli...
array_base: $[
Классные новые фичи!
Лучше сообщения     об ошибках$str = “Привет, $name. Последнийвизит был $last. Сейчас $time.”;                            ...
Лучше сообщения       об ошибках $str = “Привет, $name. Последний визит был $last. Сейчас $time.”;Use of uninitialized val...
Лучше сообщения       об ошибках $str = “Привет, $name. Последний визит был $last. Сейчас $time.”;Use of uninitialized val...
state-переменныеmy $LINES_READ = 0;sub read_line {  $LINES_READ++;  ...}                      perlsub
state-переменные{    my $LINES_READ = 0;    sub read_line {      $LINES_READ++;       ...    }}                          p...
state-переменныеsub read_line {  state $LINES_READ = 0;  $LINES_READ++;  ...}                           perlsub
Истина и определённость                    perlop
Истина и определённость  sub record_sale {                      perlop
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;                               perlop
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount                         ...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount               || $produc...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount               || $produc...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount               || $produc...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = defined $amount               ? $...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount               || $produc...
Истина и определённость  sub record_sale {    my ($product, $amount) = @_;    my $price = $amount               // $produc...
Новый оператор ИЛИsub record_sale {  my ($product, $amount) = @_;    $amount //= $product->price;    ...}                 ...
say $what• новая встроенная функция say• делает тоже самое, что и print• только добавляет n в конце строки                ...
say $what            perlfunc
say $whatprint “Привет, мир!n”;                          perlfunc
say $whatprint “Привет, мир!n”;print “$messagen”;                          perlfunc
say $whatprint “Привет, мир!n”;print “$messagen”;print “$_n” for @lines;                           perlfunc
say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;print “$_n” for @lines;                           perl...
say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;say $message;print “$_n” for @lines;                  ...
say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;say $message;print “$_n” for @lines;say for @lines;   ...
$ perl -e ‘print “Foon”’
$ perl -e ‘print “Foon”’$ perl -E ‘say “Foo”’
Рекурсия!sub fact {  my ($x) = @_; # must be +int  return $x if $x == 1;  return $x * fact($x - 1);}
Рекурсия!sub fact {  my ($x) = @_; # must be +int  return $x if $x == 1;  return $x * fact($x - 1);}
Рекурсия!my $fact = sub {   my ($x) = @_; # must be +int   return $x if $x == 1;   return $x * $fact->($x - 1);};
Рекурсия!my $fact = sub {   my ($x) = @_; # must be +int   return $x if $x == 1;   return $x * $fact->($x - 1);};
Рекурсия!my $fact; $fact = sub {   my ($x) = @_; # must be +int   return $x if $x == 1;   return $x * $fact->($x - 1);};
Рекурсия!my $fact; $fact = sub {   my ($x) = @_; # must be +int   return $x if $x == 1;   return $x * $fact->($x - 1);};
Рекурсия!use Scalar::Util qw(weaken);my $fact = do {   my $f1; my $f2 = $f1 = sub {      my ($x) = @_;      return $x if $...
Рекурсия!use 5.16.0; # current submy $fact = sub {   my ($x) = @_; # must be +int   return $x if $x == 1;   return $x * __...
Дескрипторы файлов!
autodieopen my $fh, ‘<‘, $filename;while (<$fh>) {   ...}close $fh;                              autodie
autodieopen my $fh, ‘<‘, $filename  or die “couldn’t open $filename: $!”;while (<$fh>) {   ...}close $fh  or die “couldn’t c...
autodieuse autodie;open my $fh, ‘<‘, $filename;while (<$fh>) {   ...}close $fh;                              autodie
autodieuse autodie;open my $fh, ‘<‘, $filename;while (<$fh>) {  no autodie;  rmdir or warn “couldn’t remove $_: $!”;}close ...
autodieuse autodie;sub foo {   my $filename = shift;   open my $fh, ‘<‘, $filename;   while (<$fh>) {      ...   }} # неявны...
IO::Filesub stream_to_fh {  my ($self, $fh) = @_;  fileno $fh    or die “can’t stream to closed fh”;  while (my $hunk = $se...
IO::Filesub stream_to_fh {  my ($self, $fh) = @_;  $fh->fileno    or die “can’t stream to closed fh”;  while (my $hunk = $s...
IO::Filesub stream_to_fh {  ...     $fh->print($hunk);  ...  $fh->close or die “error closing: $!”;}open my $target, ‘>’, ...
IO::Fileuse IO::File;sub stream_to_fh {  ...     $fh->print($hunk);  ...  $fh->close or die “error closing: $!”;}open my $...
IO::Fileuse 5.14.0;sub stream_to_fh {  ...     $fh->print($hunk);  ...  $fh->close or die “error closing: $!”;}open my $ta...
IO::Fileuse 5.14.0; use autodie;sub stream_to_fh {  ...     $fh->print($hunk);  ...  $fh->close or die “error closing: $!”...
package-блокиpackage Library::Awesome;our $VERSION = 1.234;sub foo { ... }1;                            perlfunc
package-блокиuse 5.12.0;package Library::Awesome1.234;sub foo { ... }1;                             perlfunc
package-блокиuse 5.12.0;package Library::Awesome1.234-alpha;sub foo { ... }1;                               perlfunc
package-блокиuse 5.12.0;package Library::Awesome1.234 {   sub foo { ... }}                              perlfunc
Перегрузка операций• перегрузка -X• перегрузка qr• "no overloading"• предупреждения неизвестных  перегрузок операций      ...
Другие новые фичи!
«Умное» сравнение      smrt match
«Умное» сравнениеif ($x ~~ $y) {    ...}
«Умное» сравнение                perldoc
«Умное» сравнение• если $x и $y неизвестны, то существует  23 возможные вариации• и некоторые из них — рекурсивные• нет, в...
«Умное» сравнение• если $x и $y неизвестны, то существует  23 возможные вариации• и некоторые из них — рекурсивные• нет, в...
«Умное» сравнение• если $x и $y неизвестны, то существует  23 возможные вариации• и некоторые из них — рекурсивные• нет, в...
«Умное» сравнение• если $x и $y неизвестны, то существует  23 возможные вариации• и некоторые из них — рекурсивные• нет, в...
Сравнение
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
Сравнениеif ($x ~~ $y)               { ... }if ($str ~~ %hash)          { ... }if ($str ~~ @arr)           { ... }if ($str...
given ($x) {   when ($y) {      ...   }   when ($z) {      ...   }}
given ($x) {   when ($y) {      try { ... }      catch {         warn “error: $_”;         return undef;       }   }}
each @array
each @arraywhile (my ($i, $v) = each @array) {  say “$i: $v”;}
push $aref, @etc;
Сейчас с меньшимколичеством багов!
Проблема 2038 года       y2038
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri De...
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri De...
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri De...
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri De...
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Ja...
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Ja...
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Ja...
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Ja...
$@     perlvar
$@     Try::Tiny
$@• Ну, на самом деле, вы используете  Try::Tiny, верно?• И это тоже делает Try::Tiny более  надёжным!• Вы видите, что eva...
$@• Ну, на самом деле, вы используете  Try::Tiny, верно?• И это тоже делает Try::Tiny более  надёжным!• Вы видите, что eva...
$@• Ну, на самом деле, вы используете  Try::Tiny, верно?• И это тоже делает Try::Tiny более  надёжным!• Вы видите, что eva...
use 5.12.0;{   package X;   sub DESTROY {       eval { }   }}eval {   my $x = bless {} => ‘X’;   die “DEATH!!”;};warn “ERR...
use 5.12.0;{   package X;   sub DESTROY {       eval { }   }}eval {   my $x = bless {} => ‘X’;   die “DEATH!!”;};warn “ERR...
use 5.14.0;{   package X;   sub DESTROY {       eval { }   }}eval {   my $x = bless {} => ‘X’;   die “DEATH!!”;};warn “ERR...
use 5.14.0;{   package X;   sub DESTROY {       eval { }   }}eval {   my $x = bless {} => ‘X’;   die “DEATH!!”;};warn “ERR...
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
Простые строки
Perl — хорош для Unicode                   perlunicode
Perl 5.16 лучше                  perlunicode
Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более  осмысленно   ...
Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более  осмысленно   ...
Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более  осмысленно   ...
«Unicode-баг»                perlunicode
«Unicode-баг»• строка не всегда рассматриваются    как Unicode• это вызывает странные ошибки, для    поиска которых требуе...
«Unicode-баг»• строка не всегда рассматриваются  как Unicode• это вызывает странные ошибки, для  поиска которых требуется ...
«Unicode-баг»• строка не всегда рассматриваются  как Unicode• это вызывает странные ошибки, для  поиска которых требуется ...
«Unicode-баг»• строка не всегда рассматриваются  как Unicode• это вызывает странные ошибки, для  поиска которых требуется ...
Unicode eval• eval $str• это октеты или символы?• что будет, если это включает в себя  «use utf8»• или вы работаете под «u...
Unicode eval• evalbytes $str• unicode_eval                        perldoc
Мой любимый 5.12-изм?if (length $input->{new_email}) {    $user->update_email(...);}Use of uninitialized value in lengthat...
Мой любимый 5.12-изм?if (length $input->{new_email}) {    $user->update_email(...);}Use of uninitialized value in lengthat...
Мой любимый 5.12-изм?if (length $input->{new_email}) {    $user->update_email(...);}Use of uninitialized value in lengthat...
say “I o{23145} Perl 5.14!”;I ♥ Perl 5.14!                                perlre
say “I o{23145} Perl 5.14!”;I ♥ Perl 5.14!                                perlre
say “I 23145 Perl 5.14!”;I ?45 Perl 5.14!                             perlre
say “I 023145 Perl 5.14!”;I 145 Perl 5.14!                              perlre
say “I 23145 Perl 5.14!”;I ?45 Perl 5.14!                             perlre
qr{  (1) (2) (3) (4)     7 10  (5) (6) (7) (8) (9) 7 10  (10)                7 10}x;                               perlre
qr{  (1) (2) (3) (4)     o{7} o{10}  (5) (6) (7) (8) (9) o{7} o{10}  (10)                g{7} g {10}}x;                   ...
Unicode 6.1
Unicode 6.1•   1F309   — мост в ночи                            charnames
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец                            charnames
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы                              charna...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане       ...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
Unicode 6.1•   1F309   — мост в ночи•   026CE   — змееносец•   1F486   — массаж головы•   1F473   — мужик в тюрбане•   1F4...
N{...}use 5.16.0;say "I N{HEAVY_BLACK_HEART} Queensr"  . "N{LATIN_SMALL_LETTER_Y_WITH_DIAERESIS}"  . "che!";              ...
Преобразования регистра         case folding
Case Folding
Case Foldingif ( lc $foo eq lc $bar ) {    ...}
Case Foldingif ( fc $foo eq fc $bar ) {    ...}
Case Folding
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
Case Folding
Case Folding“file under: L$name”“file under: F$name”
Case Folding“file under: L$name”“file under: F$name”
В регулярныхвыражениях стали лучше
именнованные сохранения   named captures
Named captures• поиск совпадений по имени, а не  позиции• избавиться от страшных $1• больше не второй Python или .Net!    ...
Named captures• поиск совпадений по имени, а не  позиции• избавиться от страшных $1• больше не второй Python или .Net!    ...
Named captures• поиск совпадений по имени, а не  позиции• избавиться от страшных $1• больше не второй Python или .Net!    ...
Named captures# псевдокодsection:property = value                           perlre
Named captures$line =~ /(w+):(w+) = (w+)/;$section = $1;$name = $2;$value = $3;                               perlre
Named captures $line =~ /     (?<section> w+):     (?<name> w+)     s* = s*     (?<value> w+) /x; $section = $+{section}; ...
Новые модификаторы my $hostname = get_hostname; $hostname =~ s/..*//;                                perlre
Новые модификаторыmy $hostname = get_hostname =~ s/..*//;                                     perlre
Новые модификаторы(my $hostname = get_hostname) =~ s/..*//;                                     perlre
Новые модификаторыmy $hostname = get_hostname =~ s/..*//r;                                     perlre
Новые модификаторыmy @short_names =   map { s/..*//; } @long_names;                                    perlre
Новые модификаторыmy @short_names =   map { s/..*//;         $_ } @long_names;                             perlre
Новые модификаторыmy @short_names =   map { my $x = $_;         $x =~ s/..*//;         $x } @long_names;                  ...
Новые модификаторыmy @short_names =   map { s/..*//r } @long_names;                                    perlre
Новые модификаторыmy @short_names =   map s/..*//r, @long_names;                                 perlre
Новые модификаторы                perldoc
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы                /u   /a   /aa   /d   /l"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?"ð" =~ /w/     ✓    ☐    ☐ ...
Новые модификаторы# Только ASCII-символы:die “Забавные неамериканские символы”   if $str =~ /P{ASCII}/;$str =~ /...регуляр...
study        perldoc
studymy $re = qr{...выражение...};my $str = q{...long complex...};$str =~ $re; # slow!!study $str; # does stuff$str =~ $re...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # slow!!study $str; # does stuff$str =~ $...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # does stuff$str ...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # используем$str ...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # используем$str ...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно, но верно!!study $str; # испол...
studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно, но верно!!study $str; # испол...
Замена модулей    Modder Modlib
Недавно появившиеся библиотеки в ядре• JSON• HTTP::Tiny• Module::Metadata• CPAN::Meta                     perlmodlib
Недавно удалённые    библиотеки• Devel::DProf• Switch• perl4 ядро• ...и другие                 perlmodlib
Удалёнстарый функционал
qw()for my $show qw(Smallville Lost V) {   $tivo->cancel_pass( $show );}                                   perlop
qw()for my $show (qw(Smallville Lost V)) {   $tivo->cancel_pass( $show );}                                    perlop
$[
$[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1]  возвращал первый элемент массива• разве это не...
$[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1]  возвращал первый элемент массива• разве это не...
$[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1]  возвращал первый элемент массива• разве это не...
$[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1]  возвращал первый элемент массива• разве это не...
$[$[ = 1;for (1 .. $#array) {  ...}                       perlvar
$[for ($[ .. $#array) {  ...}                        perlvar
$[   Переназначена переменная $[.Вы идиот или типа того? at -e line 123.                                          perlvar
$[  Use of assignment to $[is deprecatedat -e line 123.                               perlvar
defined @arr
Вопросы?
Спасибо за внимание!
Оригинал      «Whats New in Perl?        v5.10 – v5.16»http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
Upcoming SlideShare
Loading in...5
×

Что нового в Perl? 5.10 — 5.16

9,825

Published on

Перевод презентации @rjbs "What's new in Perl? v5.10 — v5.16" http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516

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

No Downloads
Views
Total Views
9,825
On Slideshare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
8
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Что нового в Perl? 5.10 — 5.16"

  1. 1. Что нового в Perl? 5.10 — 5.16 Рикардо Синес (Ricardo Signes, rjbs)
  2. 2. Perl 5 Что нового?
  3. 3. Perl 5.10Для тех, кто не совсем безумен
  4. 4. Perl 5.12Для использования каждый день
  5. 5. Perl 5.14 Для прагматиков
  6. 6. Perl 5.16Для настоящих программистов
  7. 7. Лексическая семантика!
  8. 8. use feature ‘say’;say “Это тест!”;{ no feature ‘say’; say “Это ошибка!”;}
  9. 9. use 5.16.0;say “Это тест!”;{ no feature ‘say’; say “Это ошибка!”;}
  10. 10. #!/usr/bin/perluse strict;use warnings;use 5.16.0; # use feature ‘:5.16’;my $x = Reticulator->new;$x->reticulate( @splines );
  11. 11. #!/usr/bin/perluse strict;use warnings; # no feature;my $x = Reticulator->new;$x->reticulate( @splines );
  12. 12. #!/usr/bin/perluse strict;use warnings; # use feature ‘:default’;my $x = Reticulator->new;$x->reticulate( @splines );
  13. 13. array_base: $[
  14. 14. Классные новые фичи!
  15. 15. Лучше сообщения об ошибках$str = “Привет, $name. Последнийвизит был $last. Сейчас $time.”; perldiag
  16. 16. Лучше сообщения об ошибках $str = “Привет, $name. Последний визит был $last. Сейчас $time.”;Use of uninitialized value inconcatenation (.) or string at hello.plx line 9. perldiag
  17. 17. Лучше сообщения об ошибках $str = “Привет, $name. Последний визит был $last. Сейчас $time.”;Use of uninitialized value $time inconcatenation (.) or string at hello.plx line 9. perldiag
  18. 18. state-переменныеmy $LINES_READ = 0;sub read_line { $LINES_READ++; ...} perlsub
  19. 19. state-переменные{ my $LINES_READ = 0; sub read_line { $LINES_READ++; ... }} perlsub
  20. 20. state-переменныеsub read_line { state $LINES_READ = 0; $LINES_READ++; ...} perlsub
  21. 21. Истина и определённость perlop
  22. 22. Истина и определённость sub record_sale { perlop
  23. 23. Истина и определённость sub record_sale { my ($product, $amount) = @_; perlop
  24. 24. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount perlop
  25. 25. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; perlop
  26. 26. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ... } perlop
  27. 27. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ... } perlop
  28. 28. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = defined $amount ? $amount : $product->price; ... } perlop
  29. 29. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ... } perlop
  30. 30. Истина и определённость sub record_sale { my ($product, $amount) = @_; my $price = $amount // $product->price; ... } perlop
  31. 31. Новый оператор ИЛИsub record_sale { my ($product, $amount) = @_; $amount //= $product->price; ...} perlop
  32. 32. say $what• новая встроенная функция say• делает тоже самое, что и print• только добавляет n в конце строки perlfunc
  33. 33. say $what perlfunc
  34. 34. say $whatprint “Привет, мир!n”; perlfunc
  35. 35. say $whatprint “Привет, мир!n”;print “$messagen”; perlfunc
  36. 36. say $whatprint “Привет, мир!n”;print “$messagen”;print “$_n” for @lines; perlfunc
  37. 37. say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;print “$_n” for @lines; perlfunc
  38. 38. say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;say $message;print “$_n” for @lines; perlfunc
  39. 39. say $whatprint “Привет, мир!n”;say “Привет, мир!”;print “$messagen”;say $message;print “$_n” for @lines;say for @lines; perlfunc
  40. 40. $ perl -e ‘print “Foon”’
  41. 41. $ perl -e ‘print “Foon”’$ perl -E ‘say “Foo”’
  42. 42. Рекурсия!sub fact { my ($x) = @_; # must be +int return $x if $x == 1; return $x * fact($x - 1);}
  43. 43. Рекурсия!sub fact { my ($x) = @_; # must be +int return $x if $x == 1; return $x * fact($x - 1);}
  44. 44. Рекурсия!my $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * $fact->($x - 1);};
  45. 45. Рекурсия!my $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * $fact->($x - 1);};
  46. 46. Рекурсия!my $fact; $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * $fact->($x - 1);};
  47. 47. Рекурсия!my $fact; $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * $fact->($x - 1);};
  48. 48. Рекурсия!use Scalar::Util qw(weaken);my $fact = do { my $f1; my $f2 = $f1 = sub { my ($x) = @_; return $x if $x == 1; return $x * $f1->($x - 1); }; weaken($f1); $f1;};
  49. 49. Рекурсия!use 5.16.0; # current submy $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * __SUB__->($x - 1);};
  50. 50. Дескрипторы файлов!
  51. 51. autodieopen my $fh, ‘<‘, $filename;while (<$fh>) { ...}close $fh; autodie
  52. 52. autodieopen my $fh, ‘<‘, $filename or die “couldn’t open $filename: $!”;while (<$fh>) { ...}close $fh or die “couldn’t close $filename: $!”; autodie
  53. 53. autodieuse autodie;open my $fh, ‘<‘, $filename;while (<$fh>) { ...}close $fh; autodie
  54. 54. autodieuse autodie;open my $fh, ‘<‘, $filename;while (<$fh>) { no autodie; rmdir or warn “couldn’t remove $_: $!”;}close $fh; autodie
  55. 55. autodieuse autodie;sub foo { my $filename = shift; open my $fh, ‘<‘, $filename; while (<$fh>) { ... }} # неявный вызов close БЕЗ autodie autodie
  56. 56. IO::Filesub stream_to_fh { my ($self, $fh) = @_; fileno $fh or die “can’t stream to closed fh”; while (my $hunk = $self->next_hunk) { print {$fh} $hunk; } close $fh or die “error closing: $!”;} perlopentut
  57. 57. IO::Filesub stream_to_fh { my ($self, $fh) = @_; $fh->fileno or die “can’t stream to closed fh”; while (my $hunk = $self->next_hunk) { $fh->print($hunk); } $fh->close or die “error closing: $!”;} perlopentut
  58. 58. IO::Filesub stream_to_fh { ... $fh->print($hunk); ... $fh->close or die “error closing: $!”;}open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket:$!”;stream_to_fh($target); perlopentut
  59. 59. IO::Fileuse IO::File;sub stream_to_fh { ... $fh->print($hunk); ... $fh->close or die “error closing: $!”;}open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket:$!”;stream_to_fh($target); perlopentut
  60. 60. IO::Fileuse 5.14.0;sub stream_to_fh { ... $fh->print($hunk); ... $fh->close or die “error closing: $!”;}open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket:$!”;stream_to_fh($target); perlopentut
  61. 61. IO::Fileuse 5.14.0; use autodie;sub stream_to_fh { ... $fh->print($hunk); ... $fh->close or die “error closing: $!”;}open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket:$!”;stream_to_fh($target); perlopentut
  62. 62. package-блокиpackage Library::Awesome;our $VERSION = 1.234;sub foo { ... }1; perlfunc
  63. 63. package-блокиuse 5.12.0;package Library::Awesome1.234;sub foo { ... }1; perlfunc
  64. 64. package-блокиuse 5.12.0;package Library::Awesome1.234-alpha;sub foo { ... }1; perlfunc
  65. 65. package-блокиuse 5.12.0;package Library::Awesome1.234 { sub foo { ... }} perlfunc
  66. 66. Перегрузка операций• перегрузка -X• перегрузка qr• "no overloading"• предупреждения неизвестных перегрузок операций perldoc
  67. 67. Другие новые фичи!
  68. 68. «Умное» сравнение smrt match
  69. 69. «Умное» сравнениеif ($x ~~ $y) { ...}
  70. 70. «Умное» сравнение perldoc
  71. 71. «Умное» сравнение• если $x и $y неизвестны, то существует 23 возможные вариации• и некоторые из них — рекурсивные• нет, вы не будет помнить их все• ... и они не интуитивные perldoc
  72. 72. «Умное» сравнение• если $x и $y неизвестны, то существует 23 возможные вариации• и некоторые из них — рекурсивные• нет, вы не будет помнить их все• ... и они не интуитивные perldoc
  73. 73. «Умное» сравнение• если $x и $y неизвестны, то существует 23 возможные вариации• и некоторые из них — рекурсивные• нет, вы не будет помнить их все• ... и они не интуитивные perldoc
  74. 74. «Умное» сравнение• если $x и $y неизвестны, то существует 23 возможные вариации• и некоторые из них — рекурсивные• нет, вы не будет помнить их все• ... и они не интуитивные perldoc
  75. 75. Сравнение
  76. 76. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  77. 77. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  78. 78. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  79. 79. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  80. 80. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  81. 81. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  82. 82. Сравнениеif ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }
  83. 83. given ($x) { when ($y) { ... } when ($z) { ... }}
  84. 84. given ($x) { when ($y) { try { ... } catch { warn “error: $_”; return undef; } }}
  85. 85. each @array
  86. 86. each @arraywhile (my ($i, $v) = each @array) { say “$i: $v”;}
  87. 87. push $aref, @etc;
  88. 88. Сейчас с меньшимколичеством багов!
  89. 89. Проблема 2038 года y2038
  90. 90. ~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri Dec 13 15:45:52 1901
  91. 91. ~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri Dec 13 15:45:52 1901
  92. 92. ~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri Dec 13 15:45:52 1901
  93. 93. ~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.10.0 -E ‘say scalar localtime 2**31’Fri Dec 13 15:45:52 1901
  94. 94. ~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Jan 18 22:14:08 2038
  95. 95. ~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Jan 18 22:14:08 2038
  96. 96. ~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Jan 18 22:14:08 2038
  97. 97. ~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’Mon Jan 18 22:14:07 2038~$ perl5.12.0 -E ‘say scalar localtime 2**31’Mon Jan 18 22:14:08 2038
  98. 98. $@ perlvar
  99. 99. $@ Try::Tiny
  100. 100. $@• Ну, на самом деле, вы используете Try::Tiny, верно?• И это тоже делает Try::Tiny более надёжным!• Вы видите, что eval и $@ — полностью ужасны Try::Tiny
  101. 101. $@• Ну, на самом деле, вы используете Try::Tiny, верно?• И это тоже делает Try::Tiny более надёжным!• Вы видите, что eval и $@ — полностью ужасны Try::Tiny
  102. 102. $@• Ну, на самом деле, вы используете Try::Tiny, верно?• И это тоже делает Try::Tiny более надёжным!• Вы видите, что eval и $@ — полностью ужасны Try::Tiny
  103. 103. use 5.12.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;$ perl5.12.4 test.plERROR: perlfunc
  104. 104. use 5.12.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;$ perl5.12.4 test.plERROR: perlfunc
  105. 105. use 5.14.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;$ perl5.12.4 test.plERROR: perlfunc
  106. 106. use 5.14.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;$ perl5.14.1 test.plERROR: DEATH!! perlfunc
  107. 107. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  108. 108. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  109. 109. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  110. 110. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  111. 111. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  112. 112. perl -le ‘print $^X’10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
  113. 113. Простые строки
  114. 114. Perl — хорош для Unicode perlunicode
  115. 115. Perl 5.16 лучше perlunicode
  116. 116. Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более осмысленно perlunicode
  117. 117. Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более осмысленно perlunicode
  118. 118. Perl 5.16 лучше• поддержка Unicode 6.1• доступно каждое свойство символа• X в регулярных выражениях — более осмысленно perlunicode
  119. 119. «Unicode-баг» perlunicode
  120. 120. «Unicode-баг»• строка не всегда рассматриваются как Unicode• это вызывает странные ошибки, для поиска которых требуется время• use feature ‘unicode_strings’;• perlunicode
  121. 121. «Unicode-баг»• строка не всегда рассматриваются как Unicode• это вызывает странные ошибки, для поиска которых требуется время• use feature ‘unicode_strings’;• perlunicode
  122. 122. «Unicode-баг»• строка не всегда рассматриваются как Unicode• это вызывает странные ошибки, для поиска которых требуется время• use feature ‘unicode_strings’;• или use 5.12.0 perlunicode
  123. 123. «Unicode-баг»• строка не всегда рассматриваются как Unicode• это вызывает странные ошибки, для поиска которых требуется время• use feature ‘unicode_strings’;• или use 5.12.0 perlunicode
  124. 124. Unicode eval• eval $str• это октеты или символы?• что будет, если это включает в себя «use utf8»• или вы работаете под «use utf8» perldoc
  125. 125. Unicode eval• evalbytes $str• unicode_eval perldoc
  126. 126. Мой любимый 5.12-изм?if (length $input->{new_email}) { $user->update_email(...);}Use of uninitialized value in lengthat - line 3120. perldiag
  127. 127. Мой любимый 5.12-изм?if (length $input->{new_email}) { $user->update_email(...);}Use of uninitialized value in lengthat - line 3120. perldiag
  128. 128. Мой любимый 5.12-изм?if (length $input->{new_email}) { $user->update_email(...);}Use of uninitialized value in lengthat - line 3120. perldiag
  129. 129. say “I o{23145} Perl 5.14!”;I ♥ Perl 5.14! perlre
  130. 130. say “I o{23145} Perl 5.14!”;I ♥ Perl 5.14! perlre
  131. 131. say “I 23145 Perl 5.14!”;I ?45 Perl 5.14! perlre
  132. 132. say “I 023145 Perl 5.14!”;I 145 Perl 5.14! perlre
  133. 133. say “I 23145 Perl 5.14!”;I ?45 Perl 5.14! perlre
  134. 134. qr{ (1) (2) (3) (4) 7 10 (5) (6) (7) (8) (9) 7 10 (10) 7 10}x; perlre
  135. 135. qr{ (1) (2) (3) (4) o{7} o{10} (5) (6) (7) (8) (9) o{7} o{10} (10) g{7} g {10}}x; perlre
  136. 136. Unicode 6.1
  137. 137. Unicode 6.1• 1F309 — мост в ночи charnames
  138. 138. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец charnames
  139. 139. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы charnames
  140. 140. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане charnames
  141. 141. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок charnames
  142. 142. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок• 1F424 — цыплёнок charnames
  143. 143. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок• 1F424 — цыплёнок• 1F425 — цыплёнок анфас charnames
  144. 144. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок• 1F424 — цыплёнок• 1F425 — цыплёнок анфас• 1F421 — иглобрюхие charnames
  145. 145. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок• 1F424 — цыплёнок• 1F425 — цыплёнок анфас• 1F421 — иглобрюхие• 1F60B — облизывающийся смайл charnames
  146. 146. Unicode 6.1• 1F309 — мост в ночи• 026CE — змееносец• 1F486 — массаж головы• 1F473 — мужик в тюрбане• 1F423 — вылупившийся цыплёнок• 1F424 — цыплёнок• 1F425 — цыплёнок анфас• 1F421 — иглобрюхие• 1F60B — облизывающийся смайл• 1F4A9 — куча говна charnames
  147. 147. N{...}use 5.16.0;say "I N{HEAVY_BLACK_HEART} Queensr" . "N{LATIN_SMALL_LETTER_Y_WITH_DIAERESIS}" . "che!"; perldiag
  148. 148. Преобразования регистра case folding
  149. 149. Case Folding
  150. 150. Case Foldingif ( lc $foo eq lc $bar ) { ...}
  151. 151. Case Foldingif ( fc $foo eq fc $bar ) { ...}
  152. 152. Case Folding
  153. 153. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  154. 154. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  155. 155. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  156. 156. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  157. 157. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  158. 158. Case Folding lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘ ➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’
  159. 159. Case Folding
  160. 160. Case Folding“file under: L$name”“file under: F$name”
  161. 161. Case Folding“file under: L$name”“file under: F$name”
  162. 162. В регулярныхвыражениях стали лучше
  163. 163. именнованные сохранения named captures
  164. 164. Named captures• поиск совпадений по имени, а не позиции• избавиться от страшных $1• больше не второй Python или .Net! perlre
  165. 165. Named captures• поиск совпадений по имени, а не позиции• избавиться от страшных $1• больше не второй Python или .Net! perlre
  166. 166. Named captures• поиск совпадений по имени, а не позиции• избавиться от страшных $1• больше не второй Python или .Net! perlre
  167. 167. Named captures# псевдокодsection:property = value perlre
  168. 168. Named captures$line =~ /(w+):(w+) = (w+)/;$section = $1;$name = $2;$value = $3; perlre
  169. 169. Named captures $line =~ / (?<section> w+): (?<name> w+) s* = s* (?<value> w+) /x; $section = $+{section}; $name = $+{name}; $value = $+{value}; perlre
  170. 170. Новые модификаторы my $hostname = get_hostname; $hostname =~ s/..*//; perlre
  171. 171. Новые модификаторыmy $hostname = get_hostname =~ s/..*//; perlre
  172. 172. Новые модификаторы(my $hostname = get_hostname) =~ s/..*//; perlre
  173. 173. Новые модификаторыmy $hostname = get_hostname =~ s/..*//r; perlre
  174. 174. Новые модификаторыmy @short_names = map { s/..*//; } @long_names; perlre
  175. 175. Новые модификаторыmy @short_names = map { s/..*//; $_ } @long_names; perlre
  176. 176. Новые модификаторыmy @short_names = map { my $x = $_; $x =~ s/..*//; $x } @long_names; perlre
  177. 177. Новые модификаторыmy @short_names = map { s/..*//r } @long_names; perlre
  178. 178. Новые модификаторыmy @short_names = map s/..*//r, @long_names; perlre
  179. 179. Новые модификаторы perldoc
  180. 180. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  181. 181. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  182. 182. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  183. 183. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  184. 184. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  185. 185. Новые модификаторы /u /a /aa /d /l"൮" =~ /d/ ✓ ☐ ☐ ¿? ¿?"ð" =~ /w/ ✓ ☐ ☐ ¿? ¿?"ff" =~ /ff/i ✓ ✓ ☐ ¿? ¿?"ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? perldoc
  186. 186. Новые модификаторы# Только ASCII-символы:die “Забавные неамериканские символы” if $str =~ /P{ASCII}/;$str =~ /...регулярное выражение.../; perlre
  187. 187. study perldoc
  188. 188. studymy $re = qr{...выражение...};my $str = q{...long complex...};$str =~ $re; # slow!!study $str; # does stuff$str =~ $re; # fast!! perldoc
  189. 189. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # slow!!study $str; # does stuff$str =~ $re; # fast!! perldoc
  190. 190. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # does stuff$str =~ $re; # fast!! perldoc
  191. 191. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # используем$str =~ $re; # fast!! perldoc
  192. 192. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно!!study $str; # используем$str =~ $re; # быстро!! perldoc
  193. 193. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно, но верно!!study $str; # используем$str =~ $re; # кто знает!! perldoc
  194. 194. studymy $re = qr{...выражение...};my $str = q{...длинная строка...};$str =~ $re; # медленно, но верно!!study $str; # используем$str =~ $re; # медленно, но верно!! perldoc
  195. 195. Замена модулей Modder Modlib
  196. 196. Недавно появившиеся библиотеки в ядре• JSON• HTTP::Tiny• Module::Metadata• CPAN::Meta perlmodlib
  197. 197. Недавно удалённые библиотеки• Devel::DProf• Switch• perl4 ядро• ...и другие perlmodlib
  198. 198. Удалёнстарый функционал
  199. 199. qw()for my $show qw(Smallville Lost V) { $tivo->cancel_pass( $show );} perlop
  200. 200. qw()for my $show (qw(Smallville Lost V)) { $tivo->cancel_pass( $show );} perlop
  201. 201. $[
  202. 202. $[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1] возвращал первый элемент массива• разве это не круто?• это так же круто, как и шрифт Comic Sans perlvar
  203. 203. $[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1] возвращал первый элемент массива• разве это не круто?• это так же круто, как и шрифт Comic Sans perlvar
  204. 204. $[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1] возвращал первый элемент массива• разве это не круто?• это так же круто, как и шрифт Comic Sans perlvar
  205. 205. $[ — индекс первого элемента в массиве• можно сделать так, чтобы $array[1] возвращал первый элемент массива• разве это не круто?• это так же круто, как и шрифт Comic Sans perlvar
  206. 206. $[$[ = 1;for (1 .. $#array) { ...} perlvar
  207. 207. $[for ($[ .. $#array) { ...} perlvar
  208. 208. $[ Переназначена переменная $[.Вы идиот или типа того? at -e line 123. perlvar
  209. 209. $[ Use of assignment to $[is deprecatedat -e line 123. perlvar
  210. 210. defined @arr
  211. 211. Вопросы?
  212. 212. Спасибо за внимание!
  213. 213. Оригинал «Whats New in Perl? v5.10 – v5.16»http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516
  1. A particular slide catching your eye?

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

×