#!/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> ){
my $search_str = $str;
my $trade_id;
# move more strict RE to bottom - we are got negative matching early
if ( $search_str =~ s/$RGX_LONG_MESS/$5-$months{$4}-$3:$1/ ){
$trade_id = $2;
}
elsif ( $search_str =~ s/$RGX_SHORT_MESS/$4-$months{$3}-$2:$5/ ){
$trade_id = $1;
}
next unless $trade_id;
# 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
__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
IyEvdXNyL2Jpbi9lbnYgcGVybAoKdXNlIHY1LjEwOwp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKI3VzZSBTbWFydDo6Q29tbWVudHM7CgpteSAkUkdYX1NIT1JUX01FU1MgPSBxci9eKFx3KylfKFxkezJ9KS0oXHd7M30pLShcZHs0fSlfKFxkKykvbzsKbXkgJFJHWF9MT05HX01FU1MgPSBxci9ebWVzc2FnZVsuXShcdyspWy5dKFx3KylfKFxkezJ9KS0oXHd7M30pLShcZHs0fSkvbzsKCiNjcmVhdGUgbW9udGggaGFzaApteSAlbW9udGhzOwojIHR3byBzeW1ib2wgZm9yIGNvcnJlY3QgbGl0ZXJhbCBtYXRjaGluZwpAbW9udGhzeyBxdyggSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMgKSB9ID0gKCAnMDAnIC4uICcxMScgKTsKCm15ICgkcmVzdWx0LCAkaW5kZXgpOwoKd2hpbGUgKCBteSAkc3RyID0gPERBVEE+ICl7CgkKCWNob21wICRzdHI7CglteSAkc2VhcmNoX3N0ciA9ICRzdHI7CglteSAkdHJhZGVfaWQ7CgkKCSMgbW92ZSBtb3JlIHN0cmljdCBSRSB0byBib3R0b20gLSB3ZSBhcmUgZ290IG5lZ2F0aXZlIG1hdGNoaW5nIGVhcmx5CglpZiAoICRzZWFyY2hfc3RyID1+IHMvJFJHWF9MT05HX01FU1MvJDUtJG1vbnRoc3skNH0tJDM6JDEvICl7CgkJJHRyYWRlX2lkID0gJDI7Cgl9CgllbHNpZiAoICRzZWFyY2hfc3RyID1+IHMvJFJHWF9TSE9SVF9NRVNTLyQ0LSRtb250aHN7JDN9LSQyOiQ1LyApewoJCSR0cmFkZV9pZCA9ICQxOwoJfQoJCgluZXh0IHVubGVzcyAkdHJhZGVfaWQ7CgkJCgkjIHNvLCBmcm9tIG5vdyB3ZSBhcmUgc2VhcmNoIEJJR0dFU1QgdmFsdWUgJiBpZ25vcmUgbGVzcwoJbmV4dCBpZiAoIGV4aXN0cyAkaW5kZXgtPnskdHJhZGVfaWR9ICYmICggJGluZGV4LT57JHRyYWRlX2lkfSBndCAkc2VhcmNoX3N0ciApICk7CgkKCSRpbmRleC0+eyR0cmFkZV9pZH0gPSAkc2VhcmNoX3N0cjsKCSRyZXN1bHQtPnskdHJhZGVfaWR9ID0gJHN0cjsKCQp9CiMgJHJlc3VsdAoKc2F5ICRyZXN1bHQtPnskX30gZm9yZWFjaCAoIHJldmVyc2Ugc29ydCBrZXlzICUkcmVzdWx0ICk7CgoKX19EQVRBX18KTjEwODk3NjdOXzdfU1dPUFRfMDMtSnVsLTIwMTFfNzg5MTkxODYueG1sCk4xMDg5NzY3Tl83X1NXT1BUXzI1LUp1bi0yMDExXzcyNzQ1ODkyLnhtbApOMTA4OTc3MkxfOV9TV09QVF8wMy1KdWwtMjAxMV83ODk3OTA1NS54bWwKTjEwODk3NzJMXzlfU1dPUFRfMjAtSnVsLTIwMTFfNjkzODA4ODcueG1sCk4xMDg5NzcyTF85X1NXT1BUXzI5LUp1bi0yMDExXzc0NzU0NjYyLnhtbAptZXNzYWdlLjExMDUzMDAzMzMxMUE0MjU5MzQ4QVMyNi5BNDI1OTM0OEFTXzI2X1NXT1BUXzAxLUp1bC0yMDExLnhtbAptZXNzYWdlLjExMDUzMDAzMzMxMUE0MjU5MzQ4QVMyNi5BNDI1OTM0OEFTXzI2X1NXT1BUXzMxLU1heS0yMDExLnhtbApBNDI1OTM0OEFTXzI2X1NXT1BUXzI5LUp1bi0yMDExXzc0NzU0NjYyLnhtbAo=