$ARGV[0] é uma string escalar. Quando você faz if($l =~ $ARGV[0]) e $ARGV[0] é '/^[\w]/g' , isso equivale a if($l =~ '/^[\w]/g') em vez de if($l =~ /^[\w]/g) . No primeiro caso, as barras são simplesmente caracteres em uma string, enquanto no final elas fazem parte da sintaxe Perl que delimita uma expressão regular.