217
Что нового в Perl? 5.10 — 5.16 Рикардо Синес (Ricardo Signes, rjbs)

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Что нового в Perl? 5.10 — 5.16

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

Рикардо Синес(Ricardo Signes, rjbs)

Page 2: Что нового в Perl? 5.10 — 5.16

Perl 5Что нового?

Page 3: Что нового в Perl? 5.10 — 5.16

Perl 5.10Для тех, кто не совсем безумен

Page 4: Что нового в Perl? 5.10 — 5.16

Perl 5.12Для использования каждый день

Page 5: Что нового в Perl? 5.10 — 5.16

Perl 5.14Для прагматиков

Page 6: Что нового в Perl? 5.10 — 5.16

Perl 5.16Для настоящих программистов

Page 7: Что нового в Perl? 5.10 — 5.16

Лексическая семантика!

Page 8: Что нового в Perl? 5.10 — 5.16

use feature ‘say’;say “Это тест!”;

{ no feature ‘say’; say “Это ошибка!”;}

Page 9: Что нового в Perl? 5.10 — 5.16

use 5.16.0;say “Это тест!”;

{ no feature ‘say’; say “Это ошибка!”;}

Page 10: Что нового в Perl? 5.10 — 5.16

#!/usr/bin/perluse strict;use warnings;use 5.16.0; # use feature ‘:5.16’;

my $x = Reticulator->new;$x->reticulate( @splines );

Page 11: Что нового в Perl? 5.10 — 5.16

#!/usr/bin/perluse strict;use warnings; # no feature;

my $x = Reticulator->new;$x->reticulate( @splines );

Page 12: Что нового в Perl? 5.10 — 5.16

#!/usr/bin/perluse strict;use warnings; # use feature ‘:default’;

my $x = Reticulator->new;$x->reticulate( @splines );

Page 13: Что нового в Perl? 5.10 — 5.16

array_base: $[

Page 14: Что нового в Perl? 5.10 — 5.16

Классные новые фичи!

Page 15: Что нового в Perl? 5.10 — 5.16

Лучше сообщения об ошибках

$str = “Привет, $name. Последний визит был $last. Сейчас $time.”;

perldiag

Page 16: Что нового в Perl? 5.10 — 5.16

$str = “Привет, $name. Последний визит был $last. Сейчас $time.”;

perldiag

Use of uninitialized value in concatenation (.) or string at hello.plx line 9.

Лучше сообщения об ошибках

Page 17: Что нового в Perl? 5.10 — 5.16

$str = “Привет, $name. Последний визит был $last. Сейчас $time.”;

perldiag

Use of uninitialized value $time in concatenation (.) or string at hello.plx line 9.

Лучше сообщения об ошибках

Page 18: Что нового в Perl? 5.10 — 5.16

state-переменные

my $LINES_READ = 0;sub read_line { $LINES_READ++; ...}

perlsub

Page 19: Что нового в Perl? 5.10 — 5.16

state-переменные

{ my $LINES_READ = 0; sub read_line { $LINES_READ++; ... }}

perlsub

Page 20: Что нового в Perl? 5.10 — 5.16

state-переменные

sub read_line { state $LINES_READ = 0; $LINES_READ++; ...}

perlsub

Page 21: Что нового в Perl? 5.10 — 5.16

Истина и определённость

perlop

Page 22: Что нового в Perl? 5.10 — 5.16

sub record_sale {

perlop

Истина и определённость

Page 23: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_;

perlop

Истина и определённость

Page 24: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount

perlop

Истина и определённость

Page 25: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price;

perlop

Истина и определённость

Page 26: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ...}

perlop

Истина и определённость

Page 27: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ...}

perlop

Истина и определённость

Page 28: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = defined $amount ? $amount : $product->price; ...}

perlop

Истина и определённость

Page 29: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount || $product->price; ...}

perlop

Истина и определённость

Page 30: Что нового в Perl? 5.10 — 5.16

sub record_sale { my ($product, $amount) = @_; my $price = $amount // $product->price; ...}

perlop

Истина и определённость

Page 31: Что нового в Perl? 5.10 — 5.16

Новый оператор ИЛИ

sub record_sale { my ($product, $amount) = @_; $amount //= $product->price; ...}

perlop

Page 32: Что нового в Perl? 5.10 — 5.16

say $what

perlfunc

• новая встроенная функция say• делает тоже самое, что и print

• только добавляет \n в конце строки

Page 33: Что нового в Perl? 5.10 — 5.16

say $what

perlfunc

Page 34: Что нового в Perl? 5.10 — 5.16

perlfunc

print “Привет, мир!\n”;

say $what

Page 35: Что нового в Perl? 5.10 — 5.16

perlfunc

print “Привет, мир!\n”;

print “$message\n”;

say $what

Page 36: Что нового в Perl? 5.10 — 5.16

perlfunc

print “Привет, мир!\n”;

print “$message\n”;

print “$_\n” for @lines;

say $what

Page 37: Что нового в Perl? 5.10 — 5.16

perlfunc

print “Привет, мир!\n”;

say “Привет, мир!”;

print “$message\n”;

print “$_\n” for @lines;

say $what

Page 38: Что нового в Perl? 5.10 — 5.16

perlfunc

print “Привет, мир!\n”;

say “Привет, мир!”;

print “$message\n”;

say $message;

print “$_\n” for @lines;

say $what

Page 39: Что нового в Perl? 5.10 — 5.16

say $what

perlfunc

print “Привет, мир!\n”;

say “Привет, мир!”;

print “$message\n”;

say $message;

print “$_\n” for @lines;

say for @lines;

Page 40: Что нового в Perl? 5.10 — 5.16
Page 41: Что нового в Perl? 5.10 — 5.16

$ perl -e ‘print “Foo\n”’

Page 42: Что нового в Perl? 5.10 — 5.16

$ perl -e ‘print “Foo\n”’

$ perl -E ‘say “Foo”’

Page 43: Что нового в Perl? 5.10 — 5.16

Рекурсия!

sub fact {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * fact($x - 1);

}

Page 44: Что нового в Perl? 5.10 — 5.16

Рекурсия!

sub fact {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * fact($x - 1);

}

Page 45: Что нового в Perl? 5.10 — 5.16

Рекурсия!

my $fact = sub {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * $fact->($x - 1);

};

Page 46: Что нового в Perl? 5.10 — 5.16

Рекурсия!

my $fact = sub {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * $fact->($x - 1);

};

Page 47: Что нового в Perl? 5.10 — 5.16

Рекурсия!

my $fact; $fact = sub {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * $fact->($x - 1);

};

Page 48: Что нового в Perl? 5.10 — 5.16

Рекурсия!

my $fact; $fact = sub {

my ($x) = @_; # must be +int

return $x if $x == 1;

return $x * $fact->($x - 1);

};

Page 49: Что нового в Perl? 5.10 — 5.16

Рекурсия!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;};

Page 50: Что нового в Perl? 5.10 — 5.16

Рекурсия!

use 5.16.0; # current sub

my $fact = sub { my ($x) = @_; # must be +int return $x if $x == 1; return $x * __SUB__->($x - 1);};

Page 51: Что нового в Perl? 5.10 — 5.16

Дескрипторы файлов!

Page 52: Что нового в Perl? 5.10 — 5.16

autodie

autodie

open my $fh, ‘<‘, $filename;

while (<$fh>) {

...

}

close $fh;

Page 53: Что нового в Perl? 5.10 — 5.16

autodie

autodie

open my $fh, ‘<‘, $filename or die “couldn’t open $filename: $!”;while (<$fh>) { ...}close $fh or die “couldn’t close $filename: $!”;

Page 54: Что нового в Perl? 5.10 — 5.16

autodie

autodie

use autodie;open my $fh, ‘<‘, $filename;while (<$fh>) { ...}close $fh;

Page 55: Что нового в Perl? 5.10 — 5.16

autodie

autodie

use autodie;open my $fh, ‘<‘, $filename;while (<$fh>) { no autodie; rmdir or warn “couldn’t remove $_: $!”;}close $fh;

Page 56: Что нового в Perl? 5.10 — 5.16

autodie

autodie

use autodie;sub foo { my $filename = shift; open my $fh, ‘<‘, $filename; while (<$fh>) { ... }} # неявный вызов close БЕЗ autodie

Page 57: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

sub 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: $!”;}

Page 58: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

sub 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: $!”;}

Page 59: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

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);

Page 60: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

use 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);

Page 61: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

use 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);

Page 62: Что нового в Perl? 5.10 — 5.16

IO::File

perlopentut

use 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);

Page 63: Что нового в Perl? 5.10 — 5.16

package-блоки

perlfunc

package Library::Awesome;

our $VERSION = 1.234;

sub foo { ... }

1;

Page 64: Что нового в Perl? 5.10 — 5.16

package-блоки

perlfunc

use 5.12.0;

package Library::Awesome1.234;

sub foo { ... }

1;

Page 65: Что нового в Perl? 5.10 — 5.16

package-блоки

perlfunc

use 5.12.0;

package Library::Awesome1.234-alpha;

sub foo { ... }

1;

Page 66: Что нового в Perl? 5.10 — 5.16

package-блоки

perlfunc

use 5.12.0;

package Library::Awesome1.234 {

sub foo { ... }

}

Page 67: Что нового в Perl? 5.10 — 5.16

Перегрузка операций

perldoc

• перегрузка -X• перегрузка qr

• "no overloading"

• предупреждения неизвестныхперегрузок операций

Page 68: Что нового в Perl? 5.10 — 5.16

Другие новые фичи!

Page 69: Что нового в Perl? 5.10 — 5.16

«Умное» сравнениеsmrt match

Page 70: Что нового в Perl? 5.10 — 5.16

«Умное» сравнение

if ($x ~~ $y) {

...

}

Page 71: Что нового в Perl? 5.10 — 5.16

perldoc

«Умное» сравнение

Page 72: Что нового в Perl? 5.10 — 5.16

perldoc

• если $x и $y неизвестны, то существует 23 возможные вариации

• и некоторые из них — рекурсивные

• нет, вы не будет помнить их все

• ... и они не интуитивные

«Умное» сравнение

Page 73: Что нового в Perl? 5.10 — 5.16

perldoc

• если $x и $y неизвестны, то существует 23 возможные вариации

• и некоторые из них — рекурсивные

• нет, вы не будет помнить их все

• ... и они не интуитивные

«Умное» сравнение

Page 74: Что нового в Perl? 5.10 — 5.16

perldoc

• если $x и $y неизвестны, то существует 23 возможные вариации

• и некоторые из них — рекурсивные

• нет, вы не будет помнить их все

• ... и они не интуитивные

«Умное» сравнение

Page 75: Что нового в Perl? 5.10 — 5.16

perldoc

• если $x и $y неизвестны, то существует 23 возможные вариации

• и некоторые из них — рекурсивные

• нет, вы не будет помнить их все

• ... и они не интуитивные

«Умное» сравнение

Page 76: Что нового в Perl? 5.10 — 5.16

Сравнение

Page 77: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 78: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 79: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 80: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 81: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 82: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 83: Что нового в Perl? 5.10 — 5.16

Сравнение

if ($x ~~ $y) { ... }if ($str ~~ %hash) { ... }if ($str ~~ @arr) { ... }if ($str ~~ [ %h, ... ]) { ... }if (%hash ~~ %h) { ... }if (%hash ~~ @arr) { ... }if (%hash ~~ [ %h, ... ]) { ... }

Page 84: Что нового в Perl? 5.10 — 5.16

given ($x) { when ($y) { ... } when ($z) { ... }}

Page 85: Что нового в Perl? 5.10 — 5.16

given ($x) { when ($y) { try { ... } catch { warn “error: $_”; return undef; } }}

Page 86: Что нового в Perl? 5.10 — 5.16

each @array

Page 87: Что нового в Perl? 5.10 — 5.16

while (my ($i, $v) = each @array) {

say “$i: $v”;

}

each @array

Page 88: Что нового в Perl? 5.10 — 5.16

push $aref, @etc;

Page 89: Что нового в Perl? 5.10 — 5.16

Сейчас с меньшим количеством багов!

Page 90: Что нового в Perl? 5.10 — 5.16

Проблема 2038 годаy2038

Page 91: Что нового в Perl? 5.10 — 5.16
Page 92: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 93: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 94: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 95: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 96: Что нового в Perl? 5.10 — 5.16
Page 97: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 98: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 99: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 100: Что нового в Perl? 5.10 — 5.16

~$ 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

Page 101: Что нового в Perl? 5.10 — 5.16

perlvar

$@

Page 102: Что нового в Perl? 5.10 — 5.16

Try::Tiny

$@

Page 103: Что нового в Perl? 5.10 — 5.16

Try::Tiny

• Ну, на самом деле, вы используете Try::Tiny, верно?

• И это тоже делает Try::Tiny более надёжным!

• Вы видите, что eval и $@ — полностью ужасны

$@

Page 104: Что нового в Perl? 5.10 — 5.16

Try::Tiny

• Ну, на самом деле, вы используете Try::Tiny, верно?

• И это тоже делает Try::Tiny более надёжным!

• Вы видите, что eval и $@ — полностью ужасны

$@

Page 105: Что нового в Perl? 5.10 — 5.16

Try::Tiny

• Ну, на самом деле, вы используете Try::Tiny, верно?

• И это тоже делает Try::Tiny более надёжным!

• Вы видите, что eval и $@ — полностью ужасны

$@

Page 106: Что нового в Perl? 5.10 — 5.16

use 5.12.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;

$ perl5.12.4 test.plERROR:

perlfunc

Page 107: Что нового в Perl? 5.10 — 5.16

use 5.12.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;

$ perl5.12.4 test.plERROR:

perlfunc

Page 108: Что нового в Perl? 5.10 — 5.16

use 5.14.0;{ package X; sub DESTROY { eval { } }}eval { my $x = bless {} => ‘X’; die “DEATH!!”;};warn “ERROR: $@”;

$ perl5.12.4 test.plERROR:

perlfunc

Page 109: Что нового в Perl? 5.10 — 5.16

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

Page 110: Что нового в Perl? 5.10 — 5.16
Page 111: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 112: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 113: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 114: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 115: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 116: Что нового в Perl? 5.10 — 5.16

perl -le ‘print $^X’

10.0: perl10.1: perl12.0: perl14.0: perl16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl

Page 117: Что нового в Perl? 5.10 — 5.16

Простые строки

Page 118: Что нового в Perl? 5.10 — 5.16

perlunicode

Perl — хорош для Unicode

Page 119: Что нового в Perl? 5.10 — 5.16

perlunicode

Perl 5.16 лучше

Page 120: Что нового в Perl? 5.10 — 5.16

perlunicode

• поддержка Unicode 6.1

• доступно каждое свойство символа• \X в регулярных выражениях — более осмысленно

Perl 5.16 лучше

Page 121: Что нового в Perl? 5.10 — 5.16

perlunicode

• поддержка Unicode 6.1

• доступно каждое свойство символа• \X в регулярных выражениях — более осмысленно

Perl 5.16 лучше

Page 122: Что нового в Perl? 5.10 — 5.16

perlunicode

• поддержка Unicode 6.1

• доступно каждое свойство символа• \X в регулярных выражениях — более осмысленно

Perl 5.16 лучше

Page 123: Что нового в Perl? 5.10 — 5.16

perlunicode

«Unicode-баг»

Page 124: Что нового в Perl? 5.10 — 5.16

perlunicode

• строка не всегда рассматриваютсякак Unicode

• это вызывает странные ошибки, для поиска которых требуется время

• use feature ‘unicode_strings’;

«Unicode-баг»

Page 125: Что нового в Perl? 5.10 — 5.16

perlunicode

• строка не всегда рассматриваютсякак Unicode

• это вызывает странные ошибки, для поиска которых требуется время

• use feature ‘unicode_strings’;

«Unicode-баг»

Page 126: Что нового в Perl? 5.10 — 5.16

perlunicode

• строка не всегда рассматриваютсякак Unicode

• это вызывает странные ошибки, для поиска которых требуется время

• use feature ‘unicode_strings’;

• или use 5.12.0

«Unicode-баг»

Page 127: Что нового в Perl? 5.10 — 5.16

perlunicode

• строка не всегда рассматриваютсякак Unicode

• это вызывает странные ошибки, для поиска которых требуется время

• use feature ‘unicode_strings’;

• или use 5.12.0

«Unicode-баг»

Page 128: Что нового в Perl? 5.10 — 5.16

perldoc

• eval $str

• это октеты или символы?

• что будет, если это включает в себя«use utf8»

• или вы работаете под «use utf8»

Unicode eval

Page 129: Что нового в Perl? 5.10 — 5.16

perldoc

• evalbytes $str

• unicode_eval

Unicode eval

Page 130: Что нового в Perl? 5.10 — 5.16

perldiag

Мой любимый 5.12-изм?

if (length $input->{new_email}) { $user->update_email(...);}

Use of uninitialized value in lengthat - line 3120.

Page 131: Что нового в Perl? 5.10 — 5.16

perldiag

Мой любимый 5.12-изм?

if (length $input->{new_email}) { $user->update_email(...);}

Use of uninitialized value in lengthat - line 3120.

Page 132: Что нового в Perl? 5.10 — 5.16

perldiag

Мой любимый 5.12-изм?

if (length $input->{new_email}) { $user->update_email(...);}

Use of uninitialized value in lengthat - line 3120.

Page 133: Что нового в Perl? 5.10 — 5.16

perlre

say “I \o{23145} Perl 5.14!”;

I ♥ Perl 5.14!

Page 134: Что нового в Perl? 5.10 — 5.16

perlre

say “I \o{23145} Perl 5.14!”;

I ♥ Perl 5.14!

Page 135: Что нового в Perl? 5.10 — 5.16

perlre

say “I \23145 Perl 5.14!”;

I ?45 Perl 5.14!

Page 136: Что нового в Perl? 5.10 — 5.16

perlre

say “I \023145 Perl 5.14!”;

I 145 Perl 5.14!

Page 137: Что нового в Perl? 5.10 — 5.16

perlre

say “I \23145 Perl 5.14!”;

I ?45 Perl 5.14!

Page 138: Что нового в Perl? 5.10 — 5.16

perlre

qr{ (1) (2) (3) (4) \7 \10 (5) (6) (7) (8) (9) \7 \10 (10) \7 \10}x;

Page 139: Что нового в Perl? 5.10 — 5.16

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;

Page 140: Что нового в Perl? 5.10 — 5.16

Unicode 6.1

Page 141: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

charnames

Page 142: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

charnames

Page 143: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

charnames

Page 144: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

charnames

Page 145: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

charnames

Page 146: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

• 1F424 — цыплёнок

charnames

Page 147: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

• 1F424 — цыплёнок

• 1F425 — цыплёнок анфас

charnames

Page 148: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

• 1F424 — цыплёнок

• 1F425 — цыплёнок анфас

• 1F421 — иглобрюхие

charnames

Page 149: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

• 1F424 — цыплёнок

• 1F425 — цыплёнок анфас

• 1F421 — иглобрюхие

• 1F60B — облизывающийся смайл

charnames

Page 150: Что нового в Perl? 5.10 — 5.16

Unicode 6.1• 1F309 — мост в ночи

• 026CE — змееносец

• 1F486 — массаж головы

• 1F473 — мужик в тюрбане

• 1F423 — вылупившийся цыплёнок

• 1F424 — цыплёнок

• 1F425 — цыплёнок анфас

• 1F421 — иглобрюхие

• 1F60B — облизывающийся смайл

• 1F4A9 — куча говна charnames

Page 151: Что нового в Perl? 5.10 — 5.16

perldiag

\N{...}

use 5.16.0;

say "I \N{HEAVY_BLACK_HEART} Queensr" . "\N{LATIN_SMALL_LETTER_Y_WITH_DIAERESIS}"

. "che!";

Page 152: Что нового в Perl? 5.10 — 5.16

Преобразования регистраcase folding

Page 153: Что нового в Perl? 5.10 — 5.16

Case Folding

Page 154: Что нового в Perl? 5.10 — 5.16

Case Folding

if ( lc $foo eq lc $bar ) { ...}

Page 155: Что нового в Perl? 5.10 — 5.16

Case Folding

if ( fc $foo eq fc $bar ) { ...}

Page 156: Что нового в Perl? 5.10 — 5.16

Case Folding

Page 157: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 158: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 159: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 160: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 161: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 162: Что нового в Perl? 5.10 — 5.16

Case Foldinglc ‘ς‘ ➔ ‘ς‘uc ‘ς‘ ➔ ‘Σ‘fc ‘ς‘ ➔ ‘σ‘

lc ‘ß’ ➔ ‘ß’uc ‘ß’ ➔ ‘SS’fc ‘ß’ ➔ ‘ss’

Page 163: Что нового в Perl? 5.10 — 5.16

Case Folding

Page 164: Что нового в Perl? 5.10 — 5.16

Case Folding

“file under: \L$name”

“file under: \F$name”

Page 165: Что нового в Perl? 5.10 — 5.16

Case Folding

“file under: \L$name”

“file under: \F$name”

Page 166: Что нового в Perl? 5.10 — 5.16

В регулярных выражениях стали лучше

Page 167: Что нового в Perl? 5.10 — 5.16

именнованные сохранения

named captures

Page 168: Что нового в Perl? 5.10 — 5.16

Named captures

• поиск совпадений по имени, а не позиции

• избавиться от страшных $1• больше не второй Python или .Net!

perlre

Page 169: Что нового в Perl? 5.10 — 5.16

Named captures

• поиск совпадений по имени, а не позиции

• избавиться от страшных $1• больше не второй Python или .Net!

perlre

Page 170: Что нового в Perl? 5.10 — 5.16

Named captures

• поиск совпадений по имени, а не позиции

• избавиться от страшных $1• больше не второй Python или .Net!

perlre

Page 171: Что нового в Perl? 5.10 — 5.16

Named captures

# псевдокодsection:property = value

perlre

Page 172: Что нового в Perl? 5.10 — 5.16

Named captures

$line =~ /(w+):(w+) = (w+)/;

$section = $1;$name = $2;$value = $3;

perlre

Page 173: Что нового в Perl? 5.10 — 5.16

Named captures$line =~ / (?<section> \w+): (?<name> \w+) \s* = \s* (?<value> \w+)/x;

$section = $+{section};$name = $+{name};$value = $+{value}; perlre

Page 174: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my $hostname = get_hostname;$hostname =~ s/\..*//;

perlre

Page 175: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my $hostname = get_hostname =~ s/\..*//;

perlre

Page 176: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

(my $hostname = get_hostname) =~ s/\..*//;

perlre

Page 177: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my $hostname = get_hostname =~ s/\..*//r;

perlre

Page 178: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my @short_names = map { s/\..*//; } @long_names;

perlre

Page 179: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my @short_names = map { s/\..*//; $_ } @long_names;

perlre

Page 180: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my @short_names = map { my $x = $_; $x =~ s/\..*//; $x } @long_names;

perlre

Page 181: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my @short_names = map { s/\..*//r } @long_names;

perlre

Page 182: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

my @short_names = map s/\..*//r, @long_names;

perlre

Page 183: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

Page 184: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 185: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 186: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 187: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 188: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 189: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perldoc

/u /a /aa /d /l

"൮" =~ /\d/

"ð" =~ /\w/

"ff" =~ /ff/i

"ff" =~ /pL/i

✓ ☐ ☐ ¿? ¿?

✓ ☐ ☐ ¿? ¿?

✓ ✓ ☐ ¿? ¿?

✓ ✓ ✓ ¿? ¿?

Page 190: Что нового в Perl? 5.10 — 5.16

Новые модификаторы

perlre

# Только ASCII-символы:die “Забавные неамериканские символы” if $str =~ /\P{ASCII}/;$str =~ /...регулярное выражение.../;

Page 191: Что нового в Perl? 5.10 — 5.16

study

perldoc

Page 192: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...long complex...};

$str =~ $re; # slow!!study $str; # does stuff$str =~ $re; # fast!!

Page 193: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # slow!!study $str; # does stuff$str =~ $re; # fast!!

Page 194: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # медленно!!study $str; # does stuff$str =~ $re; # fast!!

Page 195: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # медленно!!study $str; # используем$str =~ $re; # fast!!

Page 196: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # медленно!!study $str; # используем$str =~ $re; # быстро!!

Page 197: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # медленно, но верно!!study $str; # используем$str =~ $re; # кто знает!!

Page 198: Что нового в Perl? 5.10 — 5.16

study

perldoc

my $re = qr{...выражение...};my $str = q{...длинная строка...};

$str =~ $re; # медленно, но верно!!study $str; # используем$str =~ $re; # медленно, но верно!!

Page 199: Что нового в Perl? 5.10 — 5.16

Замена модулейModder Modlib

Page 200: Что нового в Perl? 5.10 — 5.16

Недавно появившиеся библиотеки в ядре

• JSON

• HTTP::Tiny

• Module::Metadata

• CPAN::Meta

perlmodlib

Page 201: Что нового в Perl? 5.10 — 5.16

Недавно удалённые библиотеки

• Devel::DProf

• Switch

• perl4 ядро

• ...и другие

perlmodlib

Page 202: Что нового в Perl? 5.10 — 5.16

Удалёнстарый функционал

Page 203: Что нового в Perl? 5.10 — 5.16

qw()

perlop

for my $show qw(Smallville Lost V) { $tivo->cancel_pass( $show );}

Page 204: Что нового в Perl? 5.10 — 5.16

qw()

perlop

for my $show (qw(Smallville Lost V)) { $tivo->cancel_pass( $show );}

Page 205: Что нового в Perl? 5.10 — 5.16

$[

Page 206: Что нового в Perl? 5.10 — 5.16

$[ — индекс первого элемента в массиве

• можно сделать так, чтобы $array[1] возвращал первый элемент массива

• разве это не круто?

• это так же круто, как и шрифт Comic Sans

perlvar

Page 207: Что нового в Perl? 5.10 — 5.16

$[ — индекс первого элемента в массиве

• можно сделать так, чтобы $array[1] возвращал первый элемент массива

• разве это не круто?

• это так же круто, как и шрифт Comic Sans

perlvar

Page 208: Что нового в Perl? 5.10 — 5.16

$[ — индекс первого элемента в массиве

• можно сделать так, чтобы $array[1] возвращал первый элемент массива

• разве это не круто?

• это так же круто, как и шрифт Comic Sans

perlvar

Page 209: Что нового в Perl? 5.10 — 5.16

$[ — индекс первого элемента в массиве

• можно сделать так, чтобы $array[1] возвращал первый элемент массива

• разве это не круто?

• это так же круто, как и шрифт Comic Sans

perlvar

Page 210: Что нового в Perl? 5.10 — 5.16

$[

perlvar

$[ = 1;

for (1 .. $#array) { ...}

Page 211: Что нового в Perl? 5.10 — 5.16

$[

perlvar

for ($[ .. $#array) { ...}

Page 212: Что нового в Perl? 5.10 — 5.16

$[

perlvar

Переназначена переменная $[.Вы идиот или типа того? at -e line 123.

Page 213: Что нового в Perl? 5.10 — 5.16

$[

perlvar

Use of assignment to $[ is deprecatedat -e line 123.

Page 214: Что нового в Perl? 5.10 — 5.16

defined @arr

Page 215: Что нового в Perl? 5.10 — 5.16

Вопросы?

Page 216: Что нового в Perl? 5.10 — 5.16

Спасибо за внимание!

Page 217: Что нового в Perl? 5.10 — 5.16

Оригинал«What's New in Perl?

v5.10 – v5.16»http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516