Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то 
первое вхождение или последнее?
А то у вас то одно, то другое. ТЗ то так об этом говорит?


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

Ответить