[Moscow.pm] transform sort function to Schwartzian Transform ??
Dmitry Karpich
meettya на gmail.com
Ср Сен 14 09:06:36 PDT 2011
Интересный вы человек, можно пару вопросов по коду? И главный вопрос - ищем-то первое вхождение или последнее?
А то у вас то одно, то другое. ТЗ то так об этом говорит?
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
> moscow-pm на pm.org | 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
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110914/bf1ac7b1/attachment.html>
Подробная информация о списке рассылки Moscow-pm