in reply to Regexp map weirdness

You're doing a map over a list of two values: 'h' and 'tt'. However, within the body of the map, you ignore the elements of the list and use the value of $1 instead. Since the m/wri(.*?)en/ match was executed second, $1 holds 'tt'. Keep in mind that, as implemented, the entire argument list is evaluated before the map begins.

If you change your code to use $_ instead, you will get the results you expected:

open(FH,"</usr/bin/perldoc"); undef $/; $_=<FH>; map (($f[$c]=$_,print "$f[$c]", $c++), m/t(.*?)e/, m/wri(.*?)en/);
I'm not sure how this snippet is being used in a larger script, but map may not be what you want here. One alternative would be to assign to @f directly: @f = (m/t(.*?)e/, m/wri(.*?)en/);