#!/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;
	
	# 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

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
