Perl:($ num)和$ num之间的差异

时间:2018-01-24 21:29:33

标签: regex perl regex-group

有人可以向我解释为什么这是差异:

my $num = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
> $num = 1
my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
> $num = 1311875297587

我非常好奇地看到有什么恶作剧在等我。

由于

1 个答案:

答案 0 :(得分:9)

在Perl中,括号通常只是改变优先级。 (例如3+4*5 vs (3+4)*5

例外情况是在赋值运算符的左侧(LHS)找到括号。在这种情况下,它会影响Perl的两个赋值运算符中的哪一个。

如果赋值的LHS是某种聚合,则使用列表赋值。否则,使用标量赋值。以下被认为是聚合:

  • (...)(parens中的任何表达)
  • @array@array[...]
  • %hash@hash{...}
  • my (...)our (...)local (...)state (...)会引发错误。)

请参阅Mini-Tutorial: Scalar vs List Assignment Operator了解两个运营商之间的差异。

在您的情况下,相关差异是评估分配的右侧(RHS)的上下文。

  • 标量赋值在标量上下文中计算其RHS操作数。在标量上下文中,匹配运算符返回一个表示成功或失败的布尔值。
  • 列表赋值在列表上下文中计算其RHS操作数。在列表上下文中,匹配运算符返回它捕获的字符串(如果匹配成功且模式不包含捕获,则返回1。)