LINUX.ORG.RU

«Разделяй и властвуй»: как обрабатывать списки «порциями»

 divideatimpera,


0

1

Есть, например, такие задачи: 1) нужно брать поля для SQL-вставки из ну очень длинного списка. Если формировать всю команду INSERT одним залпом - будет фейл. Формирую, стало быть, частями, разбивая исходный список на удобоваримые «порции». Кстати, такую же вставку можно было бы делать и вообще распараллелено

2) есть у меня список, который нужно обрабатывать как «упорядоченный хеш», т.е. что-то вроде

["Great"=>"Britain", "Northern"=>"Ireland", "Patrice"=>"Lumumba", "Communism"=>"Young of world"]
. Вот хотелось бы брать из него по два элемента как в обычном while (my ($key,$val)=each %hash) - и таким образом перестать беспокоиться, начать жить...

Но тут у меня на пути встаёт пресловутый TMTOWTDI. А именно то, что на Perl-е совсем не хочется писать нормальные циклы, а хочется каких-нибудь лютых извращений наподобие такого:

@a=split //,do { open my $fh, q(/etc/fstab); join ("",map { chomp; $_ } <$fh>)};
say
  join("\n", 
    map {
      join("",grep defined $_, @a[$_*20..($_+1)*20]) 
    } 0..int(@a/20-1)
  );

В общем... фундаментальный вопрос: как правильно, а главное - эстетично (ведь Perl - это прежде всего язык эстетов) решить задачу обработки массива по частям, не прибегая к дурацким вычислениям и уж упаси Боже - к мелкобуржуазным циклам for(;;)?

На что я намекаю... В «примитивном» BASH есть, например, такая вот архиполезная конструкция:

$ echo {0..115..20}
0 20 40 60 80 100

Неужели на Perl'е это без чудесной арифметики никак не реализуется?

Спасибо! :)

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 3)

1) нужно брать поля для SQL-вставки из ну очень длинного списка. Если формировать всю команду INSERT одним залпом - будет фейл. Формирую, стало быть, частями, разбивая исходный список на удобоваримые «порции». Кстати, такую же вставку можно было бы делать и вообще распараллелено

распараллеливание ничего не даст. использую COPY ... FROM STDIN, пихай данные в туда например.

exception13 ★★★★★
()
Ответ на: комментарий от disarmer

splice же!

Да, вполне неплохо. Хотя постоянное изменение списка без объективной на то надобности выглядит не очень с т.з. производительности...

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Возможно, надо мерять. Возможно быстрее будет отрезать данные с хвоста массива.

Можно не изменять массив, но тогда немного считать придётся:

my $i=0;
while(@array>=$i){
  my @part=splice @array,$i,20;
  $i+=20;
  process(@part);
}

disarmer ★★★
()
Ответ на: комментарий от DRVTiny

Замерь nytprof'ом. Возможно узкое место совсем не здесь.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.