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

Nikolay Mishin mi на ya.ru
Пт Сен 9 08:21:29 PDT 2011


Hi Moscow PM

Помогите , есть программа, сортирующая файлы:
можно ли ее переписать с использованием Schwartzian Transform
типа @new = map { $_->[0] }
  sort { $b->[1] <=> $a->[1] || $a->[2] cmp $b->[2] }
  map { [ $_, /=(\d+)/, uc($_) ] } @old;
у меня что-то не получается
#содержимое confile
# 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
open( CONSULTS, "confile" );
@scons = <CONSULTS>;
close CONSULTS;
my %is_trade_id_unique;
foreach ( reverse sort consort @scons ) {
    chomp;
    if ( $_ =~ m/(\w+_\d+_\w+)_(\d+)-([A-Za-z]{3})-2011_(\d+)[.]xml/i ) {
        my ( $trade_id, $date, $month, $row_num ) = ( $1, $2, $3, $4 );
        if ( !$is_trade_id_unique{$trade_id} ) {
            print $_. "\n";
            $is_trade_id_unique{$trade_id} = 1;
        }
    }
 
}
 
#N1089767N_7_SWOPT_03-Jul-2011_78919186.xml
sub consort {
    $aa = $a;
    $bb = $b;
 
  # save our variables because our sort routine affects them.  If I "chomp $a"
  # that will actually change the line seen in the foreach loop that calls this.
    chomp $aa;
    chomp $bb;
 
    $aa =~ s/^  *//;
    $bb =~ s/^  *//;
 
    my %months = (
        FY  => 0,
        Jan => 1,
        Feb => 2,
        Mar => 3,
        Apr => 4,
        May => 5,
        Jun => 6,
        Jul => 7,
        Aug => 8,
        Sep => 9,
        Oct => 10,
        Nov => 11,
        Dec => 12,
    );
 
    my ( $trade_id,  $date,  $month,  $row_num );
    my ( $btrade_id, $bdate, $bmonth, $brow_num );
    if ( $aa =~ m/(\w+_\d+_\w+)_(\d+)-([A-Za-z]{3})-2011_(\d+)[.]xml/i ) {
        ( $trade_id, $date, $month, $row_num ) = ( $1, $2, $months{$3}, $4 );
    }
    if ( $bb =~ m/(\w+_\d+_\w+)_(\d+)-([A-Za-z]{3})-2011_(\d+)[.]xml/i ) {
        ( $btrade_id, $bdate, $bmonth, $brow_num ) =
          ( $1, $2, $months{$3}, $4 );
    }
 
         $trade_id cmp $btrade_id
      || $month <=> $bmonth
      || $date <=> $bdate
      || $row_num <=> $brow_num;
 
}
 


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