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