<div>14.09.2011, 20:06, "Dmitry Karpich" <meettya@gmail.com>:</div><blockquote><div>Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?</div><div>А то у вас то одно, то другое. ТЗ то так об этом говорит?</div></blockquote><div>Ищем последнее пришедшее.. по дате по строке</div><blockquote><div> </div><br /><div><div>On Sep 14, 2011, at 3:36 PM, Nikolay Mishin wrote:</div><br /><blockquote><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? кто где и что может сделать с вашими регулярками?</div></blockquote><div>согласен - это черезчур</div><blockquote><div><blockquote><div><div>#                                 N<span>1089767</span>N_7_SWOPT_03-Jul-2011_<span>78919186</span>.xml</div><div>Readonly my $RGX_SHORT_MESS => qr/(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/;</div><div>#                                message.<span>110530033311</span>A<span>4259348</span>AS26.A<span>4259348</span>AS_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></div></blockquote><div>-- согласен..тоже там просто была проблема еще и в том, что почему-то в SunOS 5.10 __DATA__ не работала (то есть perl не видел этих данных)</div><blockquote><div><div> </div><blockquote><div><div>my @file_names = <DATA>;</div><div>### @file_names:@file_names</div></div></blockquote>- а вот тут вы запускаете ненужный цикл, да еще с вызовом функции на каждого члена, выкидывая после этого результат, хотя он вам пригодится позднее</div></blockquote><div>--а здесь я игрался с модулями use Sort::Key qw(rkeysort_inplace); потом use List::UtilsBy qw( rev_sort_by );</div><div>думая, что с этого есть какой-то профит.. получается.у Sort::Key возможно на больших объемах есть</div><div>(т.к. он частично на си написан) , но в моей системе добавлением </div><div><div>use lib "/rwa/data/team/MISHNIK/perl/utils/Sort-Key-1.28/lib";</div><div>use lib "/rwa/data/team/MISHNIK/perl/utils/Test-Simple-0.98/lib";</div></div><div>он не установился говоря Can't locate loadable object for module Sort::Key in @INC .. а прав на установку - нет</div><div>так что я взял  List::UtilsBy - это чистый perl </div><div>в итоге не нужно ни того ни другого</div><blockquote><div><br /><blockquote><div><div>rkeysort_inplace { make_trade_sortest($_) } @file_names;</div><div>my %is_avaible;</div></div></blockquote>- и еще один<br /><blockquote><div><div>foreach my $file_name (@file_names) {</div><div>    my ($trade_id);</div></div></blockquote>- а вот здесь ваше имя файла "тыкается" в регулярки второй раз с тем же успехом, профит с этого какой?<br /><blockquote><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? намекаю - модуль из этого вырастет ?</div></blockquote><div>;)) здесь вы правы, что это должна быть функция </div><blockquote><div><br /><blockquote><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><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>N<span>1089767</span>N_7_SWOPT_03-Jul-2011_<span>78919186</span>.xml</div><div>N<span>1089767</span>N_7_SWOPT_25-Jun-2011_<span>72745892</span>.xml</div><div>N<span>1089772</span>L_9_SWOPT_03-Jul-2011_<span>78979055</span>.xml</div><div>N<span>1089772</span>L_9_SWOPT_20-Jul-2011_<span>69380887</span>.xml</div><div>N<span>1089772</span>L_9_SWOPT_29-Jun-2011_<span>74754662</span>.xml</div><div>message.<span>110530033311</span>A<span>4259348</span>AS26.A<span>4259348</span>AS_26_SWOPT_01-Jul-2011.xml</div><div>message.<span>110530033311</span>A<span>4259348</span>AS26.A<span>4259348</span>AS_26_SWOPT_31-May-2011.xml</div><div>A<span>4259348</span>AS_26_SWOPT_29-Jun-2011_<span>74754662</span>.xml</div></div></blockquote><div>Можете просто пояснить мне пометки, я честно сделал "домашнее задание" вместе с вами, так что вроде  как не "за так" прошу вас еще чуть-чуть потрудится.</div></div></blockquote><div>кстати ваш первый скрипт я внимательно изучил, просто казалось, что его можно разительно улучшить</div><div>спасибо за замечания..тут по ходу выяснилось, что использовать Sort::Maker , который советует Domian Convey в Perl Best Practices</div><div>нельзя, т.к. он битый и с глюками</div><blockquote><div><div> </div><div><... mass skip ...></div><blockquote><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></blockquote></div><div>PS. Ах, да, модифицированный вариант  <a href="https://ideone.com/lk59w">https://ideone.com/lk59w</a> моего предыдущего решения. Для тех, кто не верит ссылкам - копипаста:</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 /><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 />N<span>1089767</span>N_7_SWOPT_03-Jul-2011_<span>78919186</span>.xml<br />N<span>1089767</span>N_7_SWOPT_25-Jun-2011_<span>72745892</span>.xml<br />N<span>1089772</span>L_9_SWOPT_03-Jul-2011_<span>78979055</span>.xml<br />N<span>1089772</span>L_9_SWOPT_20-Jul-2011_<span>69380887</span>.xml<br />N<span>1089772</span>L_9_SWOPT_29-Jun-2011_<span>74754662</span>.xml<br />message.<span>110530033311</span>A<span>4259348</span>AS26.A<span>4259348</span>AS_26_SWOPT_01-Jul-2011.xml<br />message.<span>110530033311</span>A<span>4259348</span>AS26.A<span>4259348</span>AS_26_SWOPT_31-May-2011.xml<br />A<span>4259348</span>AS_26_SWOPT_29-Jun-2011_<span>74754662</span>.xml<br /><br /><br /></div><br /><span>-- <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 /></span></blockquote><div>--<br />Nikolay Mishin</div>