Perl: ($num) 和 $num 的区别
Perl: Difference between ($num) and $num
谁能给我解释一下为什么会这样:
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
我超级想知道有什么恶作剧等着我。
谢谢
在 Perl 中,括号通常只是改变优先级。 (例如 3+4*5
与 (3+4)*5
)
例外情况是括号位于赋值运算符的左侧 (LHS)。在那种情况下,它会影响将使用 Perl 的两个赋值运算符中的哪一个。
如果分配的 LHS 是某种聚合,则使用列表分配。否则,使用标量赋值。以下被认为是聚合:
(...)
(括号中的任何表达式)
@array
和 @array[...]
%hash
和 @hash{...}
my (...)
、our (...)
和 local (...)
(state (...)
会引发错误。)
请参阅 Mini-Tutorial: Scalar vs List Assignment Operator 了解两个运算符之间的区别。
在您的情况下,相关的差异是评估作业右侧 (RHS) 的上下文。
- 标量赋值在标量上下文中评估其 RHS 操作数。在标量上下文中,匹配运算符 returns 一个指示成功或失败的布尔值。
- 列表赋值在列表上下文中评估其 RHS 操作数。在列表上下文中,匹配运算符 returns 它捕获的字符串(或者
1
如果匹配成功并且模式不包含捕获)。
谁能给我解释一下为什么会这样:
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
我超级想知道有什么恶作剧等着我。
谢谢
在 Perl 中,括号通常只是改变优先级。 (例如 3+4*5
与 (3+4)*5
)
例外情况是括号位于赋值运算符的左侧 (LHS)。在那种情况下,它会影响将使用 Perl 的两个赋值运算符中的哪一个。
如果分配的 LHS 是某种聚合,则使用列表分配。否则,使用标量赋值。以下被认为是聚合:
(...)
(括号中的任何表达式)@array
和@array[...]
%hash
和@hash{...}
my (...)
、our (...)
和local (...)
(state (...)
会引发错误。)
请参阅 Mini-Tutorial: Scalar vs List Assignment Operator 了解两个运算符之间的区别。
在您的情况下,相关的差异是评估作业右侧 (RHS) 的上下文。
- 标量赋值在标量上下文中评估其 RHS 操作数。在标量上下文中,匹配运算符 returns 一个指示成功或失败的布尔值。
- 列表赋值在列表上下文中评估其 RHS 操作数。在列表上下文中,匹配运算符 returns 它捕获的字符串(或者
1
如果匹配成功并且模式不包含捕获)。