我写了这样的perl程序:
#program1
$sentence = "dog cat";
%replacememts = ("dog" => "wolf","cat" => "tiger");
($val = $sentence) =~ s/(join "|",keys %replacements)/$replacements{$1}/g;
print "$val\n";
它将打印“狗猫” 。这不是我想要的答案。 但是,当添加匿名数组和取消引用数组时,如下所示:
#program2
$sentence = "dog cat";
%replacememts = ("dog" => "wolf","cat" => "tiger");
($val = $sentence) =~ s/(@{[join "|",keys %replacements]})/$replacements{$1}/g;
print "$val\n";
它将打印“狼虎” 。这是我想要的答案。为什么? program1和program2有什么区别?有人可以告诉我,谢谢!
答案 0 :(得分:3)
好,您正在定义%replacememts
并尝试使用%replacements
。这就是为什么必须总是 use strict
和use warnings 'all'
毫无例外地位于所编写的每个Perl程序顶部的原因。然后,您将需要尽可能晚地使用my
声明每个变量(不要只是在顶部放置一大堆声明)
最终,您的想法正确,但是替换的第一个参数必须是正则表达式模式。它会插值Perl变量,这就是为什么当您使用数组时它会起作用的原因,但您不能只是使用任意Perl表达式
您需要将正则表达式模式构建为变量,并在替换中使用该变量。像这样。这样也更清楚
use strict;
use warnings 'all';
my $sentence = 'dog cat';
my %replacements = ( dog => 'wolf', cat => 'tiger' );
my $re = join '|', keys %replacements;
(my $val = $sentence) =~ s/($re)/$replacements{$1}/g;
print "$val\n";
wolf tiger