14.09.2011, 20:06, "Dmitry Karpich" <[email protected]>:
Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?А то у вас то одно, то другое. ТЗ то так об этом говорит?
Ищем последнее пришедшее.. по дате по строке
On Sep 14, 2011, at 3:36 PM, Nikolay Mishin wrote:- зачем вам тут Readonly? кто где и что может сделать с вашими регулярками?В итоге получилось такое решение: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' );
согласен - это черезчур
# N1089767N_7_SWOPT_03-Jul-2011_78919186.xmlReadonly my $RGX_SHORT_MESS => qr/(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/;# message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xmlReadonly my $RGX_LONG_MESS => qr/message[.](\w+)[.](\w+)_(\d{2})-(\w{3})-(\d{4})/;- вот смотрите, у вас тут ЕСТЬ ВЫНУЖДЕННЫЙ цикл, зачем вы его "впустую" прогоняете?
-- согласен..тоже там просто была проблема еще и в том, что почему-то в SunOS 5.10 __DATA__ не работала (то есть perl не видел этих данных)
- а вот тут вы запускаете ненужный цикл, да еще с вызовом функции на каждого члена, выкидывая после этого результат, хотя он вам пригодится позднееmy @file_names = <DATA>;### @file_names:@file_names
--а здесь я игрался с модулями use Sort::Key qw(rkeysort_inplace); потом use List::UtilsBy qw( rev_sort_by );
думая, что с этого есть какой-то профит.. получается.у Sort::Key возможно на больших объемах есть
(т.к. он частично на си написан) , но в моей системе добавлением
use lib "/rwa/data/team/MISHNIK/perl/utils/Sort-Key-1.28/lib";
use lib "/rwa/data/team/MISHNIK/perl/utils/Test-Simple-0.98/lib";
он не установился говоря Can't locate loadable object for module Sort::Key in @INC .. а прав на установку - нет
так что я взял List::UtilsBy - это чистый perl
в итоге не нужно ни того ни другого
- и еще одинrkeysort_inplace { make_trade_sortest($_) } @file_names;my %is_avaible;- а вот здесь ваше имя файла "тыкается" в регулярки второй раз с тем же успехом, профит с этого какой?foreach my $file_name (@file_names) {my ($trade_id);- вы уверены, что print - это хороший и расширяемый return? намекаю - модуль из этого вырастет ?given ($file_name) {when ($RGX_SHORT_MESS) {$trade_id = $1;}when ($RGX_LONG_MESS) {$trade_id = $2;}}if ( !$is_avaible{$trade_id} ) {
;)) здесь вы правы, что это должна быть функция
- в этой функции имя файла первый раз "тыкается" в регуляркиprint "$file_name";}$is_avaible{$trade_id}++;}### @file_names:@file_names#function make name good for sort alphabeticallysub 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.xmlN1089767N_7_SWOPT_25-Jun-2011_72745892.xmlN1089772L_9_SWOPT_03-Jul-2011_78979055.xmlN1089772L_9_SWOPT_20-Jul-2011_69380887.xmlN1089772L_9_SWOPT_29-Jun-2011_74754662.xmlmessage.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xmlmessage.110530033311A4259348AS26.A4259348AS_26_SWOPT_31-May-2011.xmlA4259348AS_26_SWOPT_29-Jun-2011_74754662.xmlМожете просто пояснить мне пометки, я честно сделал "домашнее задание" вместе с вами, так что вроде как не "за так" прошу вас еще чуть-чуть потрудится.
кстати ваш первый скрипт я внимательно изучил, просто казалось, что его можно разительно улучшить
спасибо за замечания..тут по ходу выяснилось, что использовать Sort::Maker , который советует Domian Convey в Perl Best Practices
нельзя, т.к. он битый и с глюками
<... mass skip ...>--Nikolay Mishin--
Moscow.pm mailing list
[email protected] | http://moscow.pm.orgPS. Ах, да, модифицированный вариант 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
--
Nikolay Mishin
Nikolay Mishin
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
