use Data::Dumper qw/Dumper/; sub flat (&@) { my ($code, @list) = @_; local ( $;, $_ ) = join_reliably (@list); $code->(); return split $;, $_ } sub join_reliably { # just a stub # TODO search for reliable delimiter my $delim="\0"; return $delim, join ($delim, @_); } #------------------------------ # examples #------------------------------ @list= ("a".."c","DBIC","A".."C","DANCER","a".."c"); @newlist = flat { s/.*$;DBIC$;(.*)$;DANCER$;.*/$1/ } @list; print Dumper \@newlist; # DIMTOWTDI @newlist = flat { m/DBIC$;(.*)$;DANCER/; $_=$1 } @list; print Dumper \@newlist;