Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么这里需要两个`{`? $text=~s/(猫西红柿)/${{qw}{$1}/ge;_Perl - Fatal编程技术网

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}