use strict; use warnings; my @arr; while () { chomp; m/(\d+)\.(\d+)\.(\d+)(\w*)/; $arr[$#arr+1] = [$4,$1,$2,$3,$_]; } @arr = sort {@$a[0] cmp @$b[0] or @$a[1] <=> @$b[1] or @$a[2] <=> @$b[2] or @$a[3] <=> @$b[3]} @arr; for (@arr) { print @$_[4]."\n"; } __DATA__ 1.2.3YABBA 4.2.7 3.2.1DABBA 9.1.3 4.5.1DOO 12.19.47