А можно код хотя бы через gist выкладывать, читать рассылку невозможно<br><br>On Wednesday, September 14, 2011, Dmitry Karpich <<a href="mailto:meettya@gmail.com">meettya@gmail.com</a>> wrote:<br>> Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?<br>
> А то у вас то одно, то другое. ТЗ то так об этом говорит?<br>><br>> On Sep 14, 2011, at 3:36 PM, Nikolay Mishin wrote:<br>><br>> В итоге получилось такое решение:<br>> use v5.10;<br>> use Sort::Key qw(rkeysort_inplace);<br>
> use Readonly;<br>> #use Smart::Comments;<br>> my %months;<br>> @months{qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec )} =<br>>   ( '00' .. '11' );<br>><br>> - зачем вам тут Readonly? кто где и что может сделать с вашими регулярками?<br>
><br>> #                                 N1089767N_7_SWOPT_03-Jul-2011_78919186.xml<br>> Readonly my $RGX_SHORT_MESS => qr/(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/;<br>> #                                message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml<br>
> Readonly my $RGX_LONG_MESS => qr/message[.](\w+)[.](\w+)_(\d{2})-(\w{3})-(\d{4})/;<br>><br>> - вот смотрите, у вас тут ЕСТЬ ВЫНУЖДЕННЫЙ цикл, зачем вы его "впустую" прогоняете?<br>><br>> my @file_names = <DATA>;<br>
> ### @file_names:@file_names<br>><br>> - а вот тут вы запускаете ненужный цикл, да еще с вызовом функции на каждого члена, выкидывая после этого результат, хотя он вам пригодится позднее<br>><br>> rkeysort_inplace { make_trade_sortest($_) } @file_names;<br>
> my %is_avaible;<br>><br>> - и еще один<br>><br>> foreach my $file_name (@file_names) {<br>>     my ($trade_id);<br>><br>> - а вот здесь ваше имя файла "тыкается" в регулярки второй раз с тем же успехом, профит с этого какой?<br>
><br>>     given ($file_name) {<br>>         when ($RGX_SHORT_MESS) {<br>>             $trade_id = $1;<br>>         }<br>>         when ($RGX_LONG_MESS) {<br>>             $trade_id = $2;<br>>         }<br>
>     }<br>>     if ( !$is_avaible{$trade_id} ) {<br>><br>> - вы уверены, что print - это хороший и расширяемый return? намекаю - модуль из этого вырастет ?<br>><br>>         print "$file_name";<br>
>     }<br>>     $is_avaible{$trade_id}++;<br>> }<br>> ### @file_names:@file_names<br>> #function make name good for sort alphabetically<br>><br>> - в этой функции имя файла первый раз "тыкается" в регулярки<br>
><br>> sub make_trade_sortest {<br>>     my ($trade_file_name) = @_;<br>>     my ( $trade_id, $date, $month, $year, $row_num );<br>>     given ($trade_file_name) {<br>>         when ($RGX_SHORT_MESS) {<br>
>             ( $trade_id, $date, $month, $year, $row_num ) =<br>>               ( $1, $2, $3, $4, $5 );<br>>         }<br>>         when ($RGX_LONG_MESS) {<br>>             ( $row_num, $trade_id, $date, $month, $year ) =<br>
>               ( $1, $2, $3, $4, $5 );<br>>         }<br>>     }<br>>     $month = $months{$month};<br>>     return "$trade_id:$year-$month-$date:$row_num";<br>> }<br>> __DATA__<br>> N1089767N_7_SWOPT_03-Jul-2011_78919186.xml<br>
> N1089767N_7_SWOPT_25-Jun-2011_72745892.xml<br>> N1089772L_9_SWOPT_03-Jul-2011_78979055.xml<br>> N1089772L_9_SWOPT_20-Jul-2011_69380887.xml<br>> N1089772L_9_SWOPT_29-Jun-2011_74754662.xml<br>> message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml<br>
> message.110530033311A4259348AS26.A4259348AS_26_SWOPT_31-May-2011.xml<br>> A4259348AS_26_SWOPT_29-Jun-2011_74754662.xml<br>><br>> Можете просто пояснить мне пометки, я честно сделал "домашнее задание" вместе с вами, так что вроде  как не "за так" прошу вас еще чуть-чуть потрудится.<br>
> <... mass skip ...><br>><br>> --<br>> Nikolay Mishin<br>> --<br>> Moscow.pm mailing list<br>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org">http://moscow.pm.org</a><br>
><br>> PS. Ах, да, модифицированный вариант  <a href="https://ideone.com/lk59w">https://ideone.com/lk59w</a> моего предыдущего решения. Для тех, кто не верит ссылкам - копипаста:<br>> #!/usr/bin/env perl<br>><br>
> use v5.10;<br>> use warnings;<br>> use utf8;<br>><br>> use Smart::Comments;<br>><br>> my $RGX_SHORT_MESS = qr/^(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/o;<br>> my $RGX_LONG_MESS = qr/^message[.](\w+)[.](\w+)_(\d{2})-(\w{3})-(\d{4})/o;<br>
><br>> #create month hash<br>> my %months;<br>> # two symbol for correct literal matching<br>> @months{ qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ) } = ( '00' .. '11' );<br>><br>
> my ($result, $index);<br>><br>> while ( my $str = <DATA> ){<br>><br>> chomp $str;<br>> my $search_str = $str;<br>> my $trade_id;<br>><br>> if ( $search_str =~ s/$RGX_SHORT_MESS/$4-$months{$3}-$2:$5/ ){<br>
> $trade_id = $1;<br>> }<br>> elsif ( $search_str =~ s/$RGX_LONG_MESS/$5-$months{$4}-$3:$1/ ){<br>> $trade_id = $2;<br>> }<br>> else { next }<br>><br>> # so, from now we are search BIGGEST value & ignore less<br>
> next if ( exists $index->{$trade_id} && ( $index->{$trade_id} gt $search_str ) );<br>><br>> $index->{$trade_id} = $search_str;<br>> $result->{$trade_id} = $str;<br>><br>> }<br>> # $result<br>
><br>> say $result->{$_} foreach ( reverse sort keys %$result );<br>><br>><br>> __DATA__<br>> N1089767N_7_SWOPT_03-Jul-2011_78919186.xml<br>> N1089767N_7_SWOPT_25-Jun-2011_72745892.xml<br>> N1089772L_9_SWOPT_03-Jul-2011_78979055.xml<br>
> N1089772L_9_SWOPT_20-Jul-2011_69380887.xml<br>> N1089772L_9_SWOPT_29-Jun-2011_74754662.xml<br>> message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml<br>> message.110530033311A4259348AS26.A4259348AS_26_SWOPT_31-May-2011.xml<br>
> A4259348AS_26_SWOPT_29-Jun-2011_74754662.xml<br>><br>><br>><br>><br><br>-- <br>С уважением,<br> Анатолий Шарифулин.<br>