[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