【问题标题】:Perl: Difference between ($num) and $num [duplicate]Perl:($num)和$num之间的区别[重复]
【发布时间】:2018-01-25 06:08:02
【问题描述】:

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

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

我非常想知道有什么恶作剧在等着我。

谢谢

【问题讨论】:

标签: regex perl regex-group


【解决方案1】:

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

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

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

  • (...)(括号中的任何表达式)
  • @array@array[...]
  • %hash@hash{...}
  • my (...)our (...)local (...)state (...) 抛出错误。)

请参阅Mini-Tutorial: Scalar vs List Assignment Operator 了解这两个运算符之间的区别。

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

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

【讨论】:

  • 我可以认为是一种铸造吗?
  • 它不会改变任何值的类型。这是运营商的选择。
  • 我正在选择表达式的输出?
  • “标点变量”。 Perl 设置的变量(标点符号或其他)记录在perlvar
  • 非常感谢!真的很有帮助!我希望我能给你更多的积分
猜你喜欢
  • 2021-08-02
  • 2016-05-29
  • 2014-01-02
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2013-10-29
  • 2012-02-13
  • 1970-01-01
相关资源
最近更新 更多