14.09.2011, 20:06, "Dmitry Karpich" <[email protected]>:
Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?
А то у вас то одно, то другое. ТЗ то так об этом говорит?
Ищем последнее пришедшее.. по дате по строке
 

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})/;
- вот смотрите, у вас тут ЕСТЬ ВЫНУЖДЕННЫЙ цикл, зачем вы его "впустую" прогоняете?
-- согласен..тоже там просто была проблема еще и в том, что почему-то в 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);
- а вот здесь ваше имя файла "тыкается" в регулярки второй раз с тем же успехом, профит с этого какой?
    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
Можете просто пояснить мне пометки, я честно сделал "домашнее задание" вместе с вами, так что вроде  как не "за так" прошу вас еще чуть-чуть потрудится.
кстати ваш первый скрипт я внимательно изучил, просто казалось, что его можно разительно улучшить
спасибо за замечания..тут по ходу выяснилось, что использовать Sort::Maker , который советует Domian Convey в Perl Best Practices
нельзя, т.к. он битый и с глюками
 
<... 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
--
Nikolay Mishin
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить