Perl 为什么这里需要两个`{`? $text=~s/(猫西红柿)/${{qw}{$1}/ge;
我不能用Perl 为什么这里需要两个`{`? $text=~s/(猫西红柿)/${{qw}{$1}/ge;,perl,Perl,我不能用{qw}->{$1}替换{{qw}}{$1},为什么 更新 $text =~ s/(cat|tomatoes)/ ${{ qw<tomatoes cat cat tomatoes> }}{$1} /ge; 5@array=qw; 6$ref=\@数组; 7{$ref}=qw; 8#@$ref=qw;//也可以 9打印“@array”; 因此,它表示取消引用既不需要{}也不需要${},只有在出现歧义时才需要{},并且$仅在标量上下文中。外括号取消引用由内括号创建的匿名哈希
{qw}->{$1}
替换{{qw}}{$1}
,为什么
更新
$text =~ s/(cat|tomatoes)/ ${{ qw<tomatoes cat cat tomatoes> }}{$1} /ge;
5@array=qw;
6$ref=\@数组;
7{$ref}=qw;
8#@$ref=qw;//也可以
9打印“@array”;
因此,它表示取消引用既不需要
{}
也不需要${}
,只有在出现歧义时才需要{}
,并且$
仅在标量上下文中。外括号取消引用由内括号创建的匿名哈希
更新澄清:如果您在编译器前面加一个“+”,给编译器一个提示,那么您使用的第二种格式就可以了:
+{qw{$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";
不同之处在于,所使用的版本只是一个变量查找,因此不需要/e,而后者是Perl代码,因此需要/e
如果你刚才
{ qw<tomatoes cat cat tomatoes> }->{$1}
因为标量上下文中的qw()返回最后一个值,这与
${ qw<tomatoes cat cat tomatoes> }{$1}
${ "tomatoes" }{$1}
(除了
使用strict;
不允许)这显然不是您想要的。Perl解析器混淆了qw周围的{}是什么意思。它不使用大括号创建哈希引用,而是将大括号视为创建代码块。您可以强制{}表示“创建哈希”在其前面加上一个加号:
$text='猫吃了熏肉';
$text=~s/(猫西红柿)/+{qw(西红柿猫西红柿)}->{$1}/ge;
打印“文本现在是$text\n”
这打印出“文本现在是西红柿吃了培根”
请参阅此处有关创建哈希引用的部分:@DavidO,我以前从未听说
{}
用于取消引用。这是真的吗?附加的+
做什么?在${{qw…….
的情况下,${
取消引用使用匿名哈希构造函数{}创建的匿名哈希
。第二种情况对编译器来说在语法上是不明确的,除非您给出一个关于您的意图的线索。+使编译器将{}视为一个表达式(散列构造函数),而不是一个代码块。@DavidO,$
是否足以解除它的限制,就像$$r{key}
这种情况,为什么${
此处强制?@new_perl:${}取消引用“something”。但它需要一个取消引用的引用。嵌套在其中的匿名哈希构造函数{}创建一个哈希引用,在您的例子中,其中包含两个元素(2个键/值对)。想象一下${[qw/这是另一个/]}[0]
或${$some\u scalar
.Hash,array,scalar;一致性行为。@new\u perl,我已添加到我的答案中。我已更新了上面我所怀疑的内容。比如,我需要对我的结论进行最后确认。@new\u perl,“和$only in scalar context”是错误的。请参阅
${ qw<tomatoes cat cat tomatoes> }{$1}
${ "tomatoes" }{$1}
$tomatoes{$1}