my @data; open(FILE2,") { chomp; my ($keyField)=split /\|/,$_; die "Don't have a sort key for $keyField" unless exists $sortOrder{$keyField}; # push in a reference to an array where the first # element is the sort order. This is the Scwartzian # transform sorting method push @data,[$sortOrder{$keyField},$_]; } close(FILE2); my @sorted=map {pop @$_} sort {$a->[0] <=> $b->[0]} @data; # I'm assuming you want the | delimiters in the output? print join "\n", @sorted;