fork download
  1. #!/usr/bin/env perl
  2.  
  3. use v5.10;
  4. use warnings;
  5. use utf8;
  6.  
  7. #use Smart::Comments;
  8.  
  9. my $RGX_SHORT_MESS = qr/^(\w+)_(\d{2})-(\w{3})-(\d{4})_(\d+)/o;
  10. my $RGX_LONG_MESS = qr/^message[.](\w+)[.](\w+)_(\d{2})-(\w{3})-(\d{4})/o;
  11.  
  12. #create month hash
  13. my %months;
  14. # two symbol for correct literal matching
  15. @months{ qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ) } = ( '00' .. '11' );
  16.  
  17. my ($result, $index);
  18.  
  19. while ( my $str = <DATA> ){
  20.  
  21. chomp $str;
  22. my $search_str = $str;
  23. my $trade_id;
  24.  
  25. # move more strict RE to bottom - we are got negative matching early
  26. if ( $search_str =~ s/$RGX_LONG_MESS/$5-$months{$4}-$3:$1/ ){
  27. $trade_id = $2;
  28. }
  29. elsif ( $search_str =~ s/$RGX_SHORT_MESS/$4-$months{$3}-$2:$5/ ){
  30. $trade_id = $1;
  31. }
  32.  
  33. next unless $trade_id;
  34.  
  35. # so, from now we are search BIGGEST value & ignore less
  36. next if ( exists $index->{$trade_id} && ( $index->{$trade_id} gt $search_str ) );
  37.  
  38. $index->{$trade_id} = $search_str;
  39. $result->{$trade_id} = $str;
  40.  
  41. }
  42. # $result
  43.  
  44. say $result->{$_} foreach ( reverse sort keys %$result );
  45.  
  46.  
  47. __DATA__
  48. N1089767N_7_SWOPT_03-Jul-2011_78919186.xml
  49. N1089767N_7_SWOPT_25-Jun-2011_72745892.xml
  50. N1089772L_9_SWOPT_03-Jul-2011_78979055.xml
  51. N1089772L_9_SWOPT_20-Jul-2011_69380887.xml
  52. N1089772L_9_SWOPT_29-Jun-2011_74754662.xml
  53. message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml
  54. message.110530033311A4259348AS26.A4259348AS_26_SWOPT_31-May-2011.xml
  55. A4259348AS_26_SWOPT_29-Jun-2011_74754662.xml
  56.  
Success #stdin #stdout 0.01s 5656KB
stdin
Standard input is empty
stdout
N1089772L_9_SWOPT_20-Jul-2011_69380887.xml
N1089767N_7_SWOPT_03-Jul-2011_78919186.xml
message.110530033311A4259348AS26.A4259348AS_26_SWOPT_01-Jul-2011.xml