use warnings; use strict; my %report = map { $_->[2] => $_->[0] } sort { $a->[1] <=> $b->[1] || $b->[2] <=> $a->[2] } map { [ $_, /^(\d+?)\/.+\/(\d+?)\./ ] } ; print $report{$_}, $/ for reverse keys %report; __DATA__ 20120824/ABC/input/daily/11337111.xml 20120710/ABC/input/daily/11337101.xml 20120330/ABC/input/daily/11337111.xml 20130614/ABC/input/daily/11337890.xml 20130120/ABC/input/daily/11337111.xml 20120206/ABC/input/daily/11337111.xml 20121005/ABC/input/daily/11337890.xml 20130110/ABC/input/daily/11337111.xml 20120923/ABC/input/daily/11337111.xml 20130416/ABC/input/daily/11337101.xml 20120404/ABC/input/daily/11337111.xml 20130211/ABC/input/daily/11337111.xml