为什么这里需要两个`{`

时间:2011-06-28 05:32:58

标签: perl

$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";

因此,它表示取消引用时不需要{}${},仅在出现歧义时才需要{},而仅在标量上下文中$

3 个答案:

答案 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