[Moscow.pm] transform sort function to Schwartzian Transform ??

Анатолий Шарифулин sharifulin на gmail.com
Ср Сен 14 09:10:06 PDT 2011


А можно код хотя бы через gist выкладывать, читать рассылку невозможно

On Wednesday, September 14, 2011, Dmitry Karpich <meettya на gmail.com> wrote:
> Интересный вы человек, можно пару вопросов по коду? И главный вопрос -
ищем-то первое вхождение или последнее?
> А то у вас то одно, то другое. ТЗ то так об этом говорит?
>
> 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/cc2e4ca1/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm