$text =~ s/(cat|tomatoes)/ ${{ qw<tomatoes cat cat tomatoes> }}{$1} /ge;
我无法用${{ qw<tomatoes cat cat tomatoes> }}{$1}
取代{ qw<tomatoes cat cat tomatoes> }->{$1}
,为什么?
更新
5 @array = qw<a b c d>;
6 $ref = \@array;
7 @{$ref} = qw<1 2 3 4>;
8 #@$ref = qw<1 2 3 4>;//also works
9 print "@array";
因此,它表示取消引用时不需要{}
和${}
,仅在出现歧义时才需要{}
,而仅在标量上下文中$
。
答案 0 :(得分:10)
${{ qw<tomatoes cat cat tomatoes> }}{$1}
是
my $ref = { qw<tomatoes cat cat tomatoes> };
${ $ref }{$key}
内括号构成一个匿名哈希构造函数。它创建一个哈希,为其分配括号的内容,然后返回对它的引用。
外括号是哈希解除引用的一部分。它们可以在明确的时候省略(例如$$ref{$key}
而不是${$ref}{$key}
)(例如,当解除引用一个简单的标量时),但这不是这种情况。
也可以使用箭头符号取消引用,因此也可以使用
{ qw<tomatoes cat cat tomatoes> }->{$1}
不同之处在于所使用的版本只是一个变量查找,所以它不需要/ e,而后者是Perl代码,所以它需要/ e。
如果你刚刚
${ qw<tomatoes cat cat tomatoes> }{$1}
与
相同${ "tomatoes" }{$1}
因为标量上下文中的qw()返回最后一个值。反过来,这与
相同$tomatoes{$1}
(除了use strict;
不允许),这显然不是你想要的。
答案 1 :(得分:2)
外括号取消引用内括号创建的匿名哈希。
更新澄清:如果你给编译器一个线索,你可以使用第二种格式:
+{ qw<tomatoes cat cat tomatoes }->{$1}
答案 2 :(得分:1)
Perl解析器对qw周围{}的含义感到混淆。它不是使用花括号来创建哈希引用,而是将花括号视为创建代码块。您可以通过在其前面加上一个加号来强制{}表示“创建哈希”:
$ text ='猫吃了培根'; $ text = ~s /(cat | tomatoes)/ + {qw(西红柿猫猫番茄)} - &gt; {$ 1} / ge; print“文本现在是$ text \ n”;
这打印出“文字现在是西红柿吃了培根”
请参阅此处有关创建哈希引用的部分:http://perldoc.perl.org/perlref.html