- RU.PERL ----------------------------------------------------------- RU.PERL - Msg : #3569 [639] От : Nick Kostirya 2:5020/400 17 мая 04, 10:49 Кому : Serge Chervjakov 17 мая 04, 21:48 Тема : map and foreach [was Проверка на вхождение в массив] ------------------------------------------------------------------------------- From: "Nick Kostirya"> Заодно буду знать, что мапу доверять не надо:). Hу за чем же так? map достаточно удобная штука. Просто иногда foreach лучше, иногда map. Вот одна история. Есть одна задачка (так для выяснения скорости разных стилей) Из строки, содержащей таблицу (разделители , и ;) создать: - массив массивов (все данные); - список со вторыми элементами; - проверить третий элементы на принадлежность заданному списку. При использовании стиля "foreach", необходимо всего два цикла foreach. Hо все три цели задачи решаются совместно. (название стилей условно :-) ) При использовании "map" стиля используется три раза map и один раз foreach, но цели задачи решаются одна за другой, не смешиваясь. Делая этот Benchmark был уверен, что "map" стиль проиграет, так как делает некоторую работу дважды, но оказалось, что при исходных данных меньше, чем "1,2,1;2,1,2;" x 400; map быстрее. Вот код. use strict; use warnings; use Benchmark; my $adv_campaigns = "1,2,1;2,1,2;" x 400; Benchmark::cmpthese(100, { 'first' => 'first', 'second' => 'second', }); sub first { # Общий массив. my @adv_campaigns = map { [split/,/] } split (/;/, $adv_campaigns); # # Список вторых элементов. my @adv_categories_for_test = map { ${$_}[1] } @adv_campaigns; # Проверяем третий элементы на равенстро одному из значений 0, 1, 2. COST_TYPE: foreach my $cost_type (map { ${$_}[2] } @adv_campaigns) { foreach (0, 1, 2) { next COST_TYPE if $cost_type == $_; } warn "cost_type '$cost_type' is unsupported."; return; } return 1; } # End 'first' sub. sub second { my @adv_campaigns = (); # Общий массив. my @adv_categories_for_test = (); # Список вторых элементов. COST_TYPE: foreach (split (/;/, $adv_campaigns)) { my ($id_adv_campaign, $id_adv_category, $cost_type) = split/,/, $_; push @adv_campaigns, [$id_adv_campaign, $id_adv_category, $cost_type]; push @adv_categories_for_test, $id_adv_category; # Проверяем третmb элементы на равенстро одному из значений 0, 1, 2. foreach (0, 1, 2) { next COST_TYPE if $cost_type == $_; } warn "cost_type '$cost_type' is unsupported."; return; } return 1; } # End 'second' sub. --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400)