sub sorter ($$) { my $am = ( $_[0] =~ /$mask/ ) ? $1 : ''; my $bm = ( $_[1] =~ /$mask/ ) ? $1 : ''; $am <=> $bm || $am cmp $bm; } # or sub sorter ($$) { my ( $am ) = ( $_[0] =~ /$mask/ ); my ( $bm ) = ( $_[1] =~ /$mask/ ); $am <=> $bm || $am cmp $bm; } # note: these are not quite equivalent # after a failed match, $am and $bm will contain: # #1) an empty string # #2) undef