当我想使用哈希键和联接功能替换文本时,为什么它不起作用?

时间:2018-07-01 11:57:24

标签: regex perl

我写了这样的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有什么区别?有人可以告诉我,谢谢!

1 个答案:

答案 0 :(得分:3)

好,您正在定义%replacememts并尝试使用%replacements。这就是为什么必须总是 use strictuse 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