SlideShare ist ein Scribd-Unternehmen logo
1 von 217
Downloaden Sie, um offline zu lesen
Что нового в 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/perl
use strict;
use warnings;
use 5.16.0; # use feature ‘:5.16’;

my $x = Reticulator->new;
$x->reticulate( @splines );
#!/usr/bin/perl
use strict;
use warnings;
            # no feature;

my $x = Reticulator->new;
$x->reticulate( @splines );
#!/usr/bin/perl
use strict;
use warnings;
            # use feature ‘:default’;

my $x = Reticulator->new;
$x->reticulate( @splines );
array_base: $[
Классные новые фичи!
Лучше сообщения
     об ошибках

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




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

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

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

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

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

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

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

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

                      perlsub
state-переменные
{
    my $LINES_READ = 0;
    sub read_line {
      $LINES_READ++;
       ...
    }
}
                          perlsub
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




                               perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = $amount
               || $product->price;



                                 perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = $amount
               || $product->price;

      ...
  }
                                 perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = $amount
               || $product->price;

      ...
  }
                                 perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = defined $amount
               ? $amount
               : $product->price;
    ...
  }
                                perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = $amount
               || $product->price;

      ...
  }
                                 perlop
Истина и определённость
  sub record_sale {
    my ($product, $amount) = @_;
    my $price = $amount
               // $product->price;

      ...
  }
                                 perlop
Новый оператор ИЛИ
sub record_sale {
  my ($product, $amount) = @_;

    $amount //= $product->price;

    ...
}
                                   perlop
say $what


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

                                       perlfunc
say $what




            perlfunc
say $what
print “Привет, мир!n”;




                          perlfunc
say $what
print “Привет, мир!n”;


print “$messagen”;




                          perlfunc
say $what
print “Привет, мир!n”;


print “$messagen”;


print “$_n” for @lines;

                           perlfunc
say $what
print “Привет, мир!n”;
say “Привет, мир!”;
print “$messagen”;


print “$_n” for @lines;

                           perlfunc
say $what
print “Привет, мир!n”;
say “Привет, мир!”;
print “$messagen”;
say $message;
print “$_n” for @lines;

                           perlfunc
say $what
print “Привет, мир!n”;
say “Привет, мир!”;
print “$messagen”;
say $message;
print “$_n” for @lines;
say for @lines;
                           perlfunc
$ 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 $x == 1;
      return $x * $f1->($x - 1);
   };
   weaken($f1);
   $f1;
};
Рекурсия!
use 5.16.0; # current sub

my $fact = sub {
   my ($x) = @_; # must be +int
   return $x if $x == 1;
   return $x * __SUB__->($x - 1);
};
Дескрипторы файлов!
autodie

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

use autodie;
open my $fh, ‘<‘, $filename;
while (<$fh>) {
   ...
}
close $fh;
                              autodie
autodie
use autodie;
open my $fh, ‘<‘, $filename;
while (<$fh>) {
  no autodie;
  rmdir or warn “couldn’t remove $_: $!”;
}
close $fh;
                                  autodie
autodie
use autodie;
sub foo {
   my $filename = shift;
   open my $fh, ‘<‘, $filename;
   while (<$fh>) {
      ...
   }
} # неявный вызов close БЕЗ autodie
                                autodie
IO::File
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: $!”;
}
                               perlopentut
IO::File
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: $!”;
}
                               perlopentut
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
IO::File
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);
                                      perlopentut
IO::File
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);
                                      perlopentut
IO::File
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);
                                      perlopentut
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"
• предупреждения неизвестных
  перегрузок операций

                               perldoc
Другие новые фичи!
«Умное» сравнение
      smrt match
«Умное» сравнение


if ($x ~~ $y) {
    ...
}
«Умное» сравнение




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

• если $x и $y неизвестны, то существует
  23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
                                     perldoc
«Умное» сравнение

• если $x и $y неизвестны, то существует
  23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
                                     perldoc
«Умное» сравнение

• если $x и $y неизвестны, то существует
  23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
                                     perldoc
«Умное» сравнение

• если $x и $y неизвестны, то существует
  23 возможные вариации
• и некоторые из них — рекурсивные
• нет, вы не будет помнить их все
• ... и они не интуитивные
                                     perldoc
Сравнение
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
Сравнение
if ($x ~~ $y)               { ... }
if ($str ~~ %hash)          { ... }
if ($str ~~ @arr)           { ... }
if ($str ~~ [ %h, ... ])    { ... }
if (%hash ~~ %h)            { ... }
if (%hash ~~ @arr)          { ... }
if (%hash ~~ [ %h, ... ])   { ... }
given ($x) {
   when ($y) {
      ...
   }
   when ($z) {
      ...
   }
}
given ($x) {
   when ($y) {
      try { ... }
      catch {
         warn “error: $_”;
         return undef;
       }
   }
}
each @array
each @array


while (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 Dec 13 15:45:52 1901
~$ 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
~$ 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
~$ 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
~$ 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
~$ 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
~$ 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
~$ 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
$@


     perlvar
$@




     Try::Tiny
$@

• Ну, на самом деле, вы используете
  Try::Tiny, верно?
• И это тоже делает Try::Tiny более
  надёжным!
• Вы видите, что eval и $@ — полностью
  ужасны

                                      Try::Tiny
$@

• Ну, на самом деле, вы используете
  Try::Tiny, верно?
• И это тоже делает Try::Tiny более
  надёжным!
• Вы видите, что eval и $@ — полностью
  ужасны

                                      Try::Tiny
$@

• Ну, на самом деле, вы используете
  Try::Tiny, верно?
• И это тоже делает Try::Tiny более
  надёжным!
• Вы видите, что eval и $@ — полностью
  ужасны

                                      Try::Tiny
use 5.12.0;
{
   package X;
   sub DESTROY {
       eval { }
   }
}
eval {
   my $x = bless {} => ‘X’;
   die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
                              perlfunc
use 5.12.0;
{
   package X;
   sub DESTROY {
       eval { }
   }
}
eval {
   my $x = bless {} => ‘X’;
   die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
                              perlfunc
use 5.14.0;
{
   package X;
   sub DESTROY {
       eval { }
   }
}
eval {
   my $x = bless {} => ‘X’;
   die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.12.4 test.pl
ERROR:
                              perlfunc
use 5.14.0;
{
   package X;
   sub DESTROY {
       eval { }
   }
}
eval {
   my $x = bless {} => ‘X’;
   die “DEATH!!”;
};
warn “ERROR: $@”;
$ perl5.14.1 test.pl
ERROR: DEATH!!
                              perlfunc
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
perl -le ‘print $^X’
10.0: perl
10.1: perl
12.0: perl
14.0: perl
16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
Простые строки
Perl — хорош для Unicode




                   perlunicode
Perl 5.16 лучше




                  perlunicode
Perl 5.16 лучше

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


                                perlunicode
Perl 5.16 лучше

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


                                perlunicode
Perl 5.16 лучше

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


                                perlunicode
«Unicode-баг»




                perlunicode
«Unicode-баг»

• строка не всегда рассматриваются
    как Unicode
• это вызывает странные ошибки, для
    поиска которых требуется время
•   use feature ‘unicode_strings’;
•
                                     perlunicode
«Unicode-баг»

• строка не всегда рассматриваются
  как Unicode
• это вызывает странные ошибки, для
  поиска которых требуется время
• use feature ‘unicode_strings’;
•
                                     perlunicode
«Unicode-баг»

• строка не всегда рассматриваются
  как Unicode
• это вызывает странные ошибки, для
  поиска которых требуется время
• use feature ‘unicode_strings’;
• или use 5.12.0
                                     perlunicode
«Unicode-баг»

• строка не всегда рассматриваются
  как Unicode
• это вызывает странные ошибки, для
  поиска которых требуется время
• use feature ‘unicode_strings’;
• или use 5.12.0
                                     perlunicode
Unicode eval

• eval $str
• это октеты или символы?
• что будет, если это включает в себя
  «use utf8»
• или вы работаете под «use utf8»
                                        perldoc
Unicode eval


• evalbytes $str
• unicode_eval

                        perldoc
Мой любимый 5.12-изм?
if (length $input->{new_email}) {
    $user->update_email(...);
}

Use of uninitialized value in length
at - line 3120.

                                    perldiag
Мой любимый 5.12-изм?
if (length $input->{new_email}) {
    $user->update_email(...);
}

Use of uninitialized value in length
at - line 3120.

                                    perldiag
Мой любимый 5.12-изм?
if (length $input->{new_email}) {
    $user->update_email(...);
}

Use of uninitialized value in length
at - line 3120.

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


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




                            charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец




                            charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы




                              charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане




                                charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок




                             charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок
•   1F424   — цыплёнок




                             charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок
•   1F424   — цыплёнок
•   1F425   — цыплёнок анфас



                             charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок
•   1F424   — цыплёнок
•   1F425   — цыплёнок анфас
•   1F421   — иглобрюхие


                             charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок
•   1F424   — цыплёнок
•   1F425   — цыплёнок анфас
•   1F421   — иглобрюхие
•   1F60B   — облизывающийся смайл

                             charnames
Unicode 6.1
•   1F309   — мост в ночи
•   026CE   — змееносец
•   1F486   — массаж головы
•   1F473   — мужик в тюрбане
•   1F423   — вылупившийся цыплёнок
•   1F424   — цыплёнок
•   1F425   — цыплёнок анфас
•   1F421   — иглобрюхие
•   1F60B   — облизывающийся смайл
•   1F4A9   — куча говна
                             charnames
N{...}

use 5.16.0;

say "I N{HEAVY_BLACK_HEART} Queensr"
  . "N{LATIN_SMALL_LETTER_Y_WITH_DIAERESIS}"
  . "che!";


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

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

if ( 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!

                                      perlre
Named captures

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

                                      perlre
Named captures

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

                                      perlre
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};
 $name = $+{name};
 $value = $+{value};       perlre
Новые модификаторы

 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;


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

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/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

                                     perldoc
Новые модификаторы
                /u   /a   /aa   /d   /l

"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?

"ð" =~ /w/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

                                     perldoc
Новые модификаторы
                /u   /a   /aa   /d   /l

"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?

"ð" =~ /w/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

                                     perldoc
Новые модификаторы
                /u   /a   /aa   /d   /l

"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?

"ð" =~ /w/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

                                     perldoc
Новые модификаторы
                /u   /a   /aa   /d   /l

"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?

"ð" =~ /w/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

                                     perldoc
Новые модификаторы
                /u   /a   /aa   /d   /l

"൮" =~ /d/     ✓    ☐    ☐     ¿?   ¿?

"ð" =~ /w/     ✓    ☐    ☐     ¿?   ¿?

"ff" =~ /ff/i   ✓    ✓    ☐     ¿?   ¿?

"ff" =~ /pL/i   ✓    ✓    ✓     ¿?   ¿?

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



                                 perlre
study




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

$str =~ $re; # slow!!
study $str; # does stuff
$str =~ $re; # fast!!
                                   perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # slow!!
study $str; # does stuff
$str =~ $re; # fast!!
                                     perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # медленно!!
study $str; # does stuff
$str =~ $re; # fast!!
                                     perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # медленно!!
study $str; # используем
$str =~ $re; # fast!!
                                     perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # медленно!!
study $str; # используем
$str =~ $re; # быстро!!
                                     perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # медленно, но верно!!
study $str; # используем
$str =~ $re; # кто знает!!
                                     perldoc
study
my $re = qr{...выражение...};
my $str = q{...длинная строка...};

$str =~ $re; # медленно, но верно!!
study $str; # используем
$str =~ $re; # медленно, но верно!!
                                     perldoc
Замена модулей
    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]
  возвращал первый элемент массива

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

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

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

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

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

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

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

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

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

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

                                       perlvar
$[

$[ = 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
Вопросы?
Спасибо за внимание!
Оригинал
      «What's New in Perl?
        v5.10 – v5.16»
http://www.slideshare.net/rjbs/whats-new-in-perl-v510-v516

Weitere ähnliche Inhalte

Was ist angesagt?

Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 
Юрий Гольцев - Сервис 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
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Andrew Shitov
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3 phpclub
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПzfconfua
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 

Was ist angesagt? (20)

Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 

Andere mochten auch

perl-regexp-refcard-a4
perl-regexp-refcard-a4perl-regexp-refcard-a4
perl-regexp-refcard-a4tutorialsruby
 
Perl 101 - The Basics of Perl Programming
Perl  101 - The Basics of Perl ProgrammingPerl  101 - The Basics of Perl Programming
Perl 101 - The Basics of Perl ProgrammingUtkarsh Sengar
 
10 Best Books Finance and Capital Markets
10 Best Books Finance and Capital Markets10 Best Books Finance and Capital Markets
10 Best Books Finance and Capital MarketsJohn Cousins
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayAnatoly Sharifulin
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...Anatoly Sharifulin
 

Andere mochten auch (7)

perl-regexp-refcard-a4
perl-regexp-refcard-a4perl-regexp-refcard-a4
perl-regexp-refcard-a4
 
Perl 101 - The Basics of Perl Programming
Perl  101 - The Basics of Perl ProgrammingPerl  101 - The Basics of Perl Programming
Perl 101 - The Basics of Perl Programming
 
10 Best Books Finance and Capital Markets
10 Best Books Finance and Capital Markets10 Best Books Finance and Capital Markets
10 Best Books Finance and Capital Markets
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google Play
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
 
ASO FAQ
ASO FAQASO FAQ
ASO FAQ
 
ASO Best Practices 2016
ASO Best Practices 2016ASO Best Practices 2016
ASO Best Practices 2016
 

Ähnlich wie Что нового в Perl? 5.10 — 5.16

Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14Andrew Shitov
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на PerlIlya Zelenchuk
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint Kyiv
 
Perl6pod lvee
Perl6pod lveePerl6pod lvee
Perl6pod lveezagru
 
Вредные советы программистам
Вредные советы программистамВредные советы программистам
Вредные советы программистамDenis Kovalev
 
Perl6pod devconf
Perl6pod devconfPerl6pod devconf
Perl6pod devconfzagru
 
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
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 

Ähnlich wie Что нового в Perl? 5.10 — 5.16 (20)

Base php 0
Base php 0Base php 0
Base php 0
 
Base php 0
Base php 0Base php 0
Base php 0
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Perl6pod lvee
Perl6pod lveePerl6pod lvee
Perl6pod lvee
 
Perl6 pod as new documentation format
Perl6 pod as new documentation formatPerl6 pod as new documentation format
Perl6 pod as new documentation format
 
Вредные советы программистам
Вредные советы программистамВредные советы программистам
Вредные советы программистам
 
Perl6pod devconf
Perl6pod devconfPerl6pod devconf
Perl6pod devconf
 
DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
What’s New in PHP7?
What’s New in PHP7?What’s New in PHP7?
What’s New in PHP7?
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 

Mehr von Anatoly Sharifulin

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхAnatoly Sharifulin
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игрAnatoly Sharifulin
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)Anatoly Sharifulin
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в МосквеAnatoly Sharifulin
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийAnatoly Sharifulin
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентовAnatoly Sharifulin
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложенийAnatoly Sharifulin
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложенийAnatoly Sharifulin
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентовAnatoly Sharifulin
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»Anatoly Sharifulin
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Anatoly Sharifulin
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruAnatoly Sharifulin
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложенийAnatoly Sharifulin
 
Удержание пользователя в приложении
Удержание пользователя в приложенииУдержание пользователя в приложении
Удержание пользователя в приложенииAnatoly Sharifulin
 
Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?Anatoly Sharifulin
 
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?Anatoly Sharifulin
 

Mehr von Anatoly Sharifulin (20)

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играх
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игр
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)
 
ASO для iOS 11
ASO для iOS 11ASO для iOS 11
ASO для iOS 11
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в Москве
 
ASO: Best Practices 2015
ASO: Best Practices 2015ASO: Best Practices 2015
ASO: Best Practices 2015
 
AppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИAppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИ
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложений
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентов
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложений
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложений
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентов
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ru
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложений
 
Удержание пользователя в приложении
Удержание пользователя в приложенииУдержание пользователя в приложении
Удержание пользователя в приложении
 
Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?
 
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?
Мобильное приложение Ostrovok.ru: зачем оно нужно, если есть «букинг»?
 
Can Perl be a hobby?
Can Perl be a hobby?Can Perl be a hobby?
Can Perl be a hobby?
 

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