<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?</div><div>А то у вас то одно, то другое. ТЗ то так об этом говорит?</div><div><br></div><br><div><div>On Sep 14, 2011, at 3:36 PM, Nikolay Mishin wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>В итоге получилось такое решение:</div><div><div>use v5.10;</div><div>use Sort::Key qw(rkeysort_inplace);</div><div>use Readonly;</div><div>#use Smart::Comments;</div><div>my %months;</div><div>@months{qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec )} =</div><div>  ( '00' .. '11' );</div></div></blockquote>- зачем вам тут Readonly? кто где и что может сделать с вашими регулярками?<blockquote type="cite"><div><div>#                                 N1089767N_7_SWOPT_03-Jul-2011_78919186.xml</div><div>Readonly my $RGX_SHORT_MESS => qr/(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/;</div><div>#                                message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml</div><div>Readonly my $RGX_LONG_MESS => qr/message[.](\w+)[.](\w+)_(\d{2})-(\w{3})-(\d{4})/;</div></div></blockquote><div>- вот смотрите, у вас тут ЕСТЬ ВЫНУЖДЕННЫЙ цикл, зачем вы его "впустую" прогоняете?</div><blockquote type="cite"><div><div>my @file_names = <DATA>;</div><div>### @file_names:@file_names</div></div></blockquote>- а вот тут вы запускаете ненужный цикл, да еще с вызовом функции на каждого члена, выкидывая после этого результат, хотя он вам пригодится позднее<br><blockquote type="cite"><div><div>rkeysort_inplace { make_trade_sortest($_) } @file_names;</div><div>my %is_avaible;</div></div></blockquote>- и еще один<br><blockquote type="cite"><div><div>foreach my $file_name (@file_names) {</div><div>    my ($trade_id);</div></div></blockquote>- а вот здесь ваше имя файла "тыкается" в регулярки второй раз с тем же успехом, профит с этого какой?<br><blockquote type="cite"><div><div>    given ($file_name) {</div><div>        when ($RGX_SHORT_MESS) {</div><div>            $trade_id = $1;</div><div>        }</div><div>        when ($RGX_LONG_MESS) {</div><div>            $trade_id = $2;</div><div>        }</div><div>    }</div><div>    if ( !$is_avaible{$trade_id} ) {</div></div></blockquote>- вы уверены, что print - это хороший и расширяемый return? намекаю - модуль из этого вырастет ?<br><blockquote type="cite"><div><div>        print "$file_name";</div><div>    }</div><div>    $is_avaible{$trade_id}++;</div><div>}</div><div>### @file_names:@file_names</div><div>#function make name good for sort alphabetically</div></div></blockquote>- в этой функции имя файла первый раз "тыкается" в регулярки<br><blockquote type="cite"><div><div>sub make_trade_sortest {</div><div>    my ($trade_file_name) = @_;</div><div>    my ( $trade_id, $date, $month, $year, $row_num );</div><div>    given ($trade_file_name) {</div><div>        when ($RGX_SHORT_MESS) {</div><div>            ( $trade_id, $date, $month, $year, $row_num ) =</div><div>              ( $1, $2, $3, $4, $5 );</div><div>        }</div><div>        when ($RGX_LONG_MESS) {</div><div>            ( $row_num, $trade_id, $date, $month, $year ) =</div><div>              ( $1, $2, $3, $4, $5 );</div><div>        }</div><div>    }</div><div>    $month = $months{$month};</div><div>    return "$trade_id:$year-$month-$date:$row_num";</div><div>}</div><div>__DATA__</div><div>N1089767N_7_SWOPT_03-Jul-2011_78919186.xml</div><div>N1089767N_7_SWOPT_25-Jun-2011_72745892.xml</div><div>N1089772L_9_SWOPT_03-Jul-2011_78979055.xml</div><div>N1089772L_9_SWOPT_20-Jul-2011_69380887.xml</div><div>N1089772L_9_SWOPT_29-Jun-2011_74754662.xml</div><div>message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml</div><div>message.110530033311A4259348AS26.A4259348AS_26_SWOPT_31-May-2011.xml</div><div>A4259348AS_26_SWOPT_29-Jun-2011_74754662.xml</div></div></blockquote><div><br></div><div>Можете просто пояснить мне пометки, я честно сделал "домашнее задание" вместе с вами, так что вроде  как не "за так" прошу вас еще чуть-чуть потрудится.</div><div><br></div><div><... mass skip ...></div><div><br></div><blockquote type="cite"><div>--</div><div>Nikolay Mishin</div>-- <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></blockquote><br></div><div>PS. Ах, да, модифицированный вариант  <a href="https://ideone.com/lk59w">https://ideone.com/lk59w</a> моего предыдущего решения. Для тех, кто не верит ссылкам - копипаста:</div><div><br></div><div>#!/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><span class="Apple-tab-span" style="white-space:pre">   </span><br><span class="Apple-tab-span" style="white-space:pre">  </span>chomp $str;<br><span class="Apple-tab-span" style="white-space:pre">       </span>my $search_str = $str;<br><span class="Apple-tab-span" style="white-space:pre">    </span>my $trade_id;<br><span class="Apple-tab-span" style="white-space:pre">     </span><br><span class="Apple-tab-span" style="white-space:pre">  </span>if ( $search_str =~ s/$RGX_SHORT_MESS/$4-$months{$3}-$2:$5/ ){<br><span class="Apple-tab-span" style="white-space:pre">            </span>$trade_id = $1;<br><span class="Apple-tab-span" style="white-space:pre">   </span>}<br><span class="Apple-tab-span" style="white-space:pre"> </span>elsif ( $search_str =~ s/$RGX_LONG_MESS/$5-$months{$4}-$3:$1/ ){<br><span class="Apple-tab-span" style="white-space:pre">          </span>$trade_id = $2;<br><span class="Apple-tab-span" style="white-space:pre">   </span>}<br><span class="Apple-tab-span" style="white-space:pre"> </span>else { next }<br><span class="Apple-tab-span" style="white-space:pre">             </span><br><span class="Apple-tab-span" style="white-space:pre">  </span># so, from now we are search BIGGEST value & ignore less<br><span class="Apple-tab-span" style="white-space:pre">      </span>next if ( exists $index->{$trade_id} && ( $index->{$trade_id} gt $search_str ) );<br><span class="Apple-tab-span" style="white-space:pre">   </span><br><span class="Apple-tab-span" style="white-space:pre">  </span>$index->{$trade_id} = $search_str;<br><span class="Apple-tab-span" style="white-space:pre">     </span>$result->{$trade_id} = $str;<br><span class="Apple-tab-span" style="white-space:pre">   </span><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></div><br></body></html>