SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Andere mochten auch

Buytaert kris tools
Buytaert kris toolsBuytaert kris tools
Buytaert kris tools
kuchinskaya
 
Развитие интернета в регионах России
Развитие интернета в регионах РоссииРазвитие интернета в регионах России
Развитие интернета в регионах России
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 protesta
soypublica
 
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 ts
Nashwa Ghoneim
 
CRE-037-創新學習趨勢
CRE-037-創新學習趨勢CRE-037-創新學習趨勢
CRE-037-創新學習趨勢
handbook
 
plaquette just in com
plaquette just in complaquette just in com
plaquette just in com
Am 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 burbujas
profesoraudp
 

Andere mochten auch (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
 

Ähnlich wie Ленивые итераторы для разбора разнородных данных. Михаил Озеров. 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のあるプログラミング生活
 

Mehr von Moscow.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 июля 2013
Moscow.pm
 

Mehr von 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