SlideShare una empresa de Scribd logo
1 de 45
Ленивые итераторы
Работаем с файлами
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
corp.mail.ru
Постановка задачи
Прочитать файл
Отфильтровать
строки
Преобразовать
строки
Записать файл
open my $in, "/tmp/in.csv";
my @file = <$in>;
close $in;
corp.mail.ru
Читаем файл
my @out;
for my $ln ( @file ) {
chomp $ln;
my @fields = split( /;/, $ln );
next unless substr( $fields[1], 0, 1 ) == 6;
@fields = @fields[0,1,2];
push @out, join( ";", @fields );
}
corp.mail.ru
Бизнес логика
open my $out, ">", "/tmp/out.txt";
syswrite( $out, join( $/, @out );
close $out;
corp.mail.ru
Пишем в файл
• Задача решена
• Код простой работает быстро
• Аспекты разделены
• Проблема с размером файла
corp.mail.ru
Подумаем
open my $in, "/tmp/in.csv";
open my $out, ">", "/tmp/out.txt";
while ( my $ln = <$in> ) {
chomp $ln;
my @fields = split( /;/, $ln );
next unless
substr( $fields[1], 0, 1 ) == 6;
@fields = @fields[0,1,2];
syswrite( $out, join( ";", @fields )."n" );
}
close $out; close $in;
corp.mail.ru
Винегрет
• Проблема с размером решена
• Быстродействие не пострадало
• Аспекты перемешались
• Модифицировать все труднее
corp.mail.ru
Еще подумаем
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
my $double = sub {
my $val = shift;
return $val * 2;
};
$double->( 4 ); # 8
corp.mail.ru
Анонимная sub
• Динамическое создание
• Ограниченное время жизни
• Не видна снаружи
• Диспетчеризация
• Можно передавать в качестве параметра
• И это еще не все…
corp.mail.ru
Особенности
sub sub_factory {
my $multiplier = shift;
return sub {
return shift * $muliplier;
}
}
my $double = sub_factory( 2 );
my $triple = sub_factory( 3 );
$double->( 3 ); # 6
$triple->( 4 ); # 12
corp.mail.ru
Closure
sub do_action {
my ( $action, $value ) = @_;
return $action->( $value );
}
my $double = sub_factory( 2 );
my $triple = sub_factory( 3 );
do_action( $double, 12 ); # 24
do_action( $triple, 7 ); # 21
corp.mail.ru
Closure as param
sub create_summer {
my $sum = 0;
return sub {
return( $sum += shift );
}
}
my $s1 = create_summer();
my $s2 = create_summer();
$s1->( 1 ); # 1
$s2->( 2 ); # ?
$s1->( 3 ); #
$s2->( 4 ); #
corp.mail.ru
Closure data
sub create_summer {
my $sum = 0;
return sub {
return( $sum += shift );
}
}
my $s1 = create_summer();
my $s2 = create_summer();
$s1->( 1 ); # 1
$s2->( 2 ); # 2
$s1->( 3 ); # ?
$s2->( 4 ); #
corp.mail.ru
Closure data
sub create_summer {
my $sum = 0;
return sub {
return( $sum += shift );
}
}
my $s1 = create_summer();
my $s2 = create_summer();
$s1->( 1 ); # 1
$s2->( 2 ); # 2
$s1->( 3 ); # 4
$s2->( 4 ); # 6
corp.mail.ru
Closure data
• Персональная копия данных
• Доступ к данным только у closure
• Работа в контексте в котором была создана
• Передача closure в качестве параметров
corp.mail.ru
Closure итог
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
sub reader {
my ( $fn, $cb ) = @_;
open my $in, $fn;
while ( my $ln = <$in> ) {
chomp $ln;
$cb->( $ln );
}
close $in;
}
corp.mail.ru
Читаем файл
sub writefile {
my ( $fn, $cb ) = @_;
open my $out, ">","/tmp/out.csv";
$cb->( sub {
my $ln = shift;
syswrite( $out, $ln . $/ );
} );
close $out;
}
corp.mail.ru
Пишем файл
write_file( "/tmp/out.cvs", sub {
my $writer = shift;
reader( "/tmp/in.csv", sub {
my $ln = shift;
my @fields = split( /;/, $ln );
next unless
substr( $fields[1], 0, 1 )==6;
@fields = @fields[0,1,2];
$writer->( join( ";", @fields ) );
}); });
corp.mail.ru
Собираем вместе
• Разнесли логику
• Сберегли память
• Растет вложенность
• Запутанный управляющий код
• Контроль над процессом
corp.mail.ru
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
• Итератор, он же курсор
• Выполняет только одну функцию
• Отделяет обход от хранилища
• Можно передать куда угодно
corp.mail.ru
Итератор
my $ln = <STDIN>;
$ary_ref = $sth->fetchrow_arrayref;
while(my ($key,$value) = each %hash )
while ( /abc/g )
my $i = rand();
corp.mail.ru
Примеры
sub sorted {
my @array = sort @_;
sub {
shift @array;
}
}
my $s = sorted( qw/e d c b a/ );
while ( my $c = $a->() ) {
print "$cn";
}
corp.mail.ru
Не ленивый итератор
sub up_to {
my ( $from, $to ) = @_;
sub {
return if $from > $to;
return $from++;
}
}
my $a = up_to( 10, 20 );
while ( my $i = $a->() ) {
print "$in";
}
corp.mail.ru
Усложняем…
sub fib {
my ( $f0, $f1, $f2 ) = ( undef, 0, 1 );
sub {
( $f0,$f1,$f2 ) = ( $f1,$f2,$f1+$f2 );
return $f0;
}
}
my $f = fib();
for ( 1..100 ) {
printf "%sn", $f->();
}
corp.mail.ru
The must
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
• Генератор
• Filter / Grep
• Map
• Reduce
corp.mail.ru
Ленивый итератор
sub reader {
my ( $fn ) = @_;
open my $in, $fn;
sub {
my $ln = <$in>;
chomp $ln;
return { line => $ln } if $ln;
close $fn;
return;
} }
corp.mail.ru
Генератор из файла
sub igrep(&@) {
my ( $cb, $it ) = @_;
sub {
while( my $val = $it->() ) {
return $val
if $cb->( $val );
}
return;
}
}
corp.mail.ru
Фильтруем
sub imap(&@) {
my ( $cb, $it ) = @_;
sub {
return
unless my $v = $it->();
return $cb->( $v );
}
}
corp.mail.ru
Преобразуем
sub ireduce(&@) {
my ( $cb, $it, $accum ) = @_;
while ( my $val = $it->() ) {
$accum = $cb->( $val,$accum )
}
return $accum;
}
corp.mail.ru
Схлопываем
sub write_file {
my ( $it, $fn ) = @_;
open my $out, ">", $fn;
my $byteCount = ireduce {
$_[1] + syswrite( $out,
$_[0]->{line} . $/ )
} $it;
close $out;
return $byteCount;
}
corp.mail.ru
Итератор в файл
my $it = reader( "/tmp/in.csv" );
$it = imap {
+{ line => join ';', @{ $_[0]->{fields} } }
} imap {
+{ fields => [ @{ $_[0] ->{fields} }[0,1,2] ] }
} igrep {
substr( $_[0]->{fields}[1], 0, 1 ) == 6;
} imap {
+{ fields => [ split /;/, $_[0]->{line} ] }
} $it;
write_file( $it, '/tmp/out.csv' );
corp.mail.ru
И наконец…
• Разнесли аспекты
• Память не кушаем
• Управление по необходимости
• Сохраняем не данные а метод
corp.mail.ru
В итоге
sub { { ab => 1, b => 2 } }
sub { { 'a' . 'c' => 1, b => 2 } }
corp.mail.ru
Perl magic plus
sub { { ab => 1, b => 2 } }
sub { { 'a' . 'c' => 1, b => 2 } }
sub { +{ 'a'.'c' => 1, b => 2 }
sub { return { 'a'.'c'=>1, b => 2 } }
corp.mail.ru
Perl magic plus
• Задача и быстрое решение
• Немного теории
• Используем callbacks
• Еще немного теории
• Используем итераторы
• Заключение
• Разнородные данные
• Исследование, пробы
• Нестабильность формата
• Легкость модификации
corp.mail.ru
Практическая часть
• Closures
• Callbacks
• Итераторы
corp.mail.ru
Теоретическая часть
Благодарности
Higher-Order Perl
by Mark Jason Dominus
ISBN 1558607013
http://hop.perl.plover.com
Михаил Озеров
m.ozerov@corp.mail.ru

Más contenido relacionado

Destacado

Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Moscow.pm
 
Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Anatoly Sharifulin
 
Buytaert kris tools
Buytaert kris toolsBuytaert kris tools
Buytaert kris toolskuchinskaya
 
Развитие интернета в регионах России
Развитие интернета в регионах РоссииРазвитие интернета в регионах России
Развитие интернета в регионах РоссииMedia Gorod
 
HR-076-如何在全球職場上成功
HR-076-如何在全球職場上成功HR-076-如何在全球職場上成功
HR-076-如何在全球職場上成功handbook
 
Elogio de la protesta
Elogio de la protestaElogio de la protesta
Elogio de la protestasoypublica
 
HR-015-物理系進路圖
HR-015-物理系進路圖HR-015-物理系進路圖
HR-015-物理系進路圖handbook
 
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยาม
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยามกิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยาม
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยามsinghabizcourse
 
Where are the new o ts
Where are the new o tsWhere are the new o ts
Where are the new o tsNashwa Ghoneim
 
CRE-037-創新學習趨勢
CRE-037-創新學習趨勢CRE-037-創新學習趨勢
CRE-037-創新學習趨勢handbook
 
A[1].lingua.portuguesa.agradece
A[1].lingua.portuguesa.agradeceA[1].lingua.portuguesa.agradece
A[1].lingua.portuguesa.agradecemhelenaneves
 
plaquette just in com
plaquette just in complaquette just in com
plaquette just in comAm Deguerry
 
Deberes de conocimiento tema 4
Deberes de conocimiento tema 4 Deberes de conocimiento tema 4
Deberes de conocimiento tema 4 Jose Miguel Fdez
 
Formulario kpsi nº 3 burbujas
Formulario kpsi nº 3 burbujasFormulario kpsi nº 3 burbujas
Formulario kpsi nº 3 burbujasprofesoraudp
 
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?Digiwin, Taiwan.
 
Top-5 vacatures week 35
Top-5 vacatures week 35Top-5 vacatures week 35
Top-5 vacatures week 35Balans
 

Destacado (20)

Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
 
Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!Guitar Hero, Wikipedia, VK, Perl, Like it!
Guitar Hero, Wikipedia, VK, Perl, Like it!
 
Buytaert kris tools
Buytaert kris toolsBuytaert kris tools
Buytaert kris tools
 
Развитие интернета в регионах России
Развитие интернета в регионах РоссииРазвитие интернета в регионах России
Развитие интернета в регионах России
 
HR-076-如何在全球職場上成功
HR-076-如何在全球職場上成功HR-076-如何在全球職場上成功
HR-076-如何在全球職場上成功
 
Elogio de la protesta
Elogio de la protestaElogio de la protesta
Elogio de la protesta
 
Parque Guarani, Joinville
Parque Guarani, Joinville	Parque Guarani, Joinville
Parque Guarani, Joinville
 
Semeer N (1)
Semeer N (1)Semeer N (1)
Semeer N (1)
 
Pariisi
PariisiPariisi
Pariisi
 
HR-015-物理系進路圖
HR-015-物理系進路圖HR-015-物理系進路圖
HR-015-物理系進路圖
 
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยาม
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยามกิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยาม
กิจกรรมโรดโชว์ ณ มหาวิทยาลัยสยาม
 
Where are the new o ts
Where are the new o tsWhere are the new o ts
Where are the new o ts
 
Itinga, araquari
Itinga, araquariItinga, araquari
Itinga, araquari
 
CRE-037-創新學習趨勢
CRE-037-創新學習趨勢CRE-037-創新學習趨勢
CRE-037-創新學習趨勢
 
A[1].lingua.portuguesa.agradece
A[1].lingua.portuguesa.agradeceA[1].lingua.portuguesa.agradece
A[1].lingua.portuguesa.agradece
 
plaquette just in com
plaquette just in complaquette just in com
plaquette just in com
 
Deberes de conocimiento tema 4
Deberes de conocimiento tema 4 Deberes de conocimiento tema 4
Deberes de conocimiento tema 4
 
Formulario kpsi nº 3 burbujas
Formulario kpsi nº 3 burbujasFormulario kpsi nº 3 burbujas
Formulario kpsi nº 3 burbujas
 
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?
mLearning App 【BSC十講】第一講 太陽是公雞叫出來的?
 
Top-5 vacatures week 35
Top-5 vacatures week 35Top-5 vacatures week 35
Top-5 vacatures week 35
 

Similar a Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 июня 2013

Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Moscow.pm
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Corcioli
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活Akira Takahashi
 

Similar a Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 июня 2013 (6)

Groovy++、来襲
Groovy++、来襲Groovy++、来襲
Groovy++、来襲
 
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
Perl para sysadmins
Perl para sysadminsPerl para sysadmins
Perl para sysadmins
 
MS Swit 2010
MS Swit 2010MS Swit 2010
MS Swit 2010
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活
 

Más de Moscow.pm

О работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfО работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfMoscow.pm
 
Fast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisFast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisMoscow.pm
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Moscow.pm
 
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Moscow.pm
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Moscow.pm
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 

Más de Moscow.pm (9)

О работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfО работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtf
 
Fast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisFast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redis
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 

Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 июня 2013

  • 2. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 4. open my $in, "/tmp/in.csv"; my @file = <$in>; close $in; corp.mail.ru Читаем файл
  • 5. my @out; for my $ln ( @file ) { chomp $ln; my @fields = split( /;/, $ln ); next unless substr( $fields[1], 0, 1 ) == 6; @fields = @fields[0,1,2]; push @out, join( ";", @fields ); } corp.mail.ru Бизнес логика
  • 6. open my $out, ">", "/tmp/out.txt"; syswrite( $out, join( $/, @out ); close $out; corp.mail.ru Пишем в файл
  • 7. • Задача решена • Код простой работает быстро • Аспекты разделены • Проблема с размером файла corp.mail.ru Подумаем
  • 8. open my $in, "/tmp/in.csv"; open my $out, ">", "/tmp/out.txt"; while ( my $ln = <$in> ) { chomp $ln; my @fields = split( /;/, $ln ); next unless substr( $fields[1], 0, 1 ) == 6; @fields = @fields[0,1,2]; syswrite( $out, join( ";", @fields )."n" ); } close $out; close $in; corp.mail.ru Винегрет
  • 9. • Проблема с размером решена • Быстродействие не пострадало • Аспекты перемешались • Модифицировать все труднее corp.mail.ru Еще подумаем
  • 10. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 11. my $double = sub { my $val = shift; return $val * 2; }; $double->( 4 ); # 8 corp.mail.ru Анонимная sub
  • 12. • Динамическое создание • Ограниченное время жизни • Не видна снаружи • Диспетчеризация • Можно передавать в качестве параметра • И это еще не все… corp.mail.ru Особенности
  • 13. sub sub_factory { my $multiplier = shift; return sub { return shift * $muliplier; } } my $double = sub_factory( 2 ); my $triple = sub_factory( 3 ); $double->( 3 ); # 6 $triple->( 4 ); # 12 corp.mail.ru Closure
  • 14. sub do_action { my ( $action, $value ) = @_; return $action->( $value ); } my $double = sub_factory( 2 ); my $triple = sub_factory( 3 ); do_action( $double, 12 ); # 24 do_action( $triple, 7 ); # 21 corp.mail.ru Closure as param
  • 15. sub create_summer { my $sum = 0; return sub { return( $sum += shift ); } } my $s1 = create_summer(); my $s2 = create_summer(); $s1->( 1 ); # 1 $s2->( 2 ); # ? $s1->( 3 ); # $s2->( 4 ); # corp.mail.ru Closure data
  • 16. sub create_summer { my $sum = 0; return sub { return( $sum += shift ); } } my $s1 = create_summer(); my $s2 = create_summer(); $s1->( 1 ); # 1 $s2->( 2 ); # 2 $s1->( 3 ); # ? $s2->( 4 ); # corp.mail.ru Closure data
  • 17. sub create_summer { my $sum = 0; return sub { return( $sum += shift ); } } my $s1 = create_summer(); my $s2 = create_summer(); $s1->( 1 ); # 1 $s2->( 2 ); # 2 $s1->( 3 ); # 4 $s2->( 4 ); # 6 corp.mail.ru Closure data
  • 18. • Персональная копия данных • Доступ к данным только у closure • Работа в контексте в котором была создана • Передача closure в качестве параметров corp.mail.ru Closure итог
  • 19. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 20. sub reader { my ( $fn, $cb ) = @_; open my $in, $fn; while ( my $ln = <$in> ) { chomp $ln; $cb->( $ln ); } close $in; } corp.mail.ru Читаем файл
  • 21. sub writefile { my ( $fn, $cb ) = @_; open my $out, ">","/tmp/out.csv"; $cb->( sub { my $ln = shift; syswrite( $out, $ln . $/ ); } ); close $out; } corp.mail.ru Пишем файл
  • 22. write_file( "/tmp/out.cvs", sub { my $writer = shift; reader( "/tmp/in.csv", sub { my $ln = shift; my @fields = split( /;/, $ln ); next unless substr( $fields[1], 0, 1 )==6; @fields = @fields[0,1,2]; $writer->( join( ";", @fields ) ); }); }); corp.mail.ru Собираем вместе
  • 23. • Разнесли логику • Сберегли память • Растет вложенность • Запутанный управляющий код • Контроль над процессом corp.mail.ru
  • 24. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 25. • Итератор, он же курсор • Выполняет только одну функцию • Отделяет обход от хранилища • Можно передать куда угодно corp.mail.ru Итератор
  • 26. my $ln = <STDIN>; $ary_ref = $sth->fetchrow_arrayref; while(my ($key,$value) = each %hash ) while ( /abc/g ) my $i = rand(); corp.mail.ru Примеры
  • 27. sub sorted { my @array = sort @_; sub { shift @array; } } my $s = sorted( qw/e d c b a/ ); while ( my $c = $a->() ) { print "$cn"; } corp.mail.ru Не ленивый итератор
  • 28. sub up_to { my ( $from, $to ) = @_; sub { return if $from > $to; return $from++; } } my $a = up_to( 10, 20 ); while ( my $i = $a->() ) { print "$in"; } corp.mail.ru Усложняем…
  • 29. sub fib { my ( $f0, $f1, $f2 ) = ( undef, 0, 1 ); sub { ( $f0,$f1,$f2 ) = ( $f1,$f2,$f1+$f2 ); return $f0; } } my $f = fib(); for ( 1..100 ) { printf "%sn", $f->(); } corp.mail.ru The must
  • 30. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 31. • Генератор • Filter / Grep • Map • Reduce corp.mail.ru Ленивый итератор
  • 32. sub reader { my ( $fn ) = @_; open my $in, $fn; sub { my $ln = <$in>; chomp $ln; return { line => $ln } if $ln; close $fn; return; } } corp.mail.ru Генератор из файла
  • 33. sub igrep(&@) { my ( $cb, $it ) = @_; sub { while( my $val = $it->() ) { return $val if $cb->( $val ); } return; } } corp.mail.ru Фильтруем
  • 34. sub imap(&@) { my ( $cb, $it ) = @_; sub { return unless my $v = $it->(); return $cb->( $v ); } } corp.mail.ru Преобразуем
  • 35. sub ireduce(&@) { my ( $cb, $it, $accum ) = @_; while ( my $val = $it->() ) { $accum = $cb->( $val,$accum ) } return $accum; } corp.mail.ru Схлопываем
  • 36. sub write_file { my ( $it, $fn ) = @_; open my $out, ">", $fn; my $byteCount = ireduce { $_[1] + syswrite( $out, $_[0]->{line} . $/ ) } $it; close $out; return $byteCount; } corp.mail.ru Итератор в файл
  • 37. my $it = reader( "/tmp/in.csv" ); $it = imap { +{ line => join ';', @{ $_[0]->{fields} } } } imap { +{ fields => [ @{ $_[0] ->{fields} }[0,1,2] ] } } igrep { substr( $_[0]->{fields}[1], 0, 1 ) == 6; } imap { +{ fields => [ split /;/, $_[0]->{line} ] } } $it; write_file( $it, '/tmp/out.csv' ); corp.mail.ru И наконец…
  • 38. • Разнесли аспекты • Память не кушаем • Управление по необходимости • Сохраняем не данные а метод corp.mail.ru В итоге
  • 39. sub { { ab => 1, b => 2 } } sub { { 'a' . 'c' => 1, b => 2 } } corp.mail.ru Perl magic plus
  • 40. sub { { ab => 1, b => 2 } } sub { { 'a' . 'c' => 1, b => 2 } } sub { +{ 'a'.'c' => 1, b => 2 } sub { return { 'a'.'c'=>1, b => 2 } } corp.mail.ru Perl magic plus
  • 41. • Задача и быстрое решение • Немного теории • Используем callbacks • Еще немного теории • Используем итераторы • Заключение
  • 42. • Разнородные данные • Исследование, пробы • Нестабильность формата • Легкость модификации corp.mail.ru Практическая часть
  • 43. • Closures • Callbacks • Итераторы corp.mail.ru Теоретическая часть
  • 44. Благодарности Higher-Order Perl by Mark Jason Dominus ISBN 1558607013 http://hop.perl.plover.com