在这个Perl片段中分配正则表达式匹配的返回值时,为什么标量周围有括号?

时间:2018-06-16 13:15:53

标签: perl

我写了以下正则表达式来获取字符串中的数字:

.show-dropdown

它按预期工作但我想知道为什么我需要在{ "player1" : [ "kills" : 0, "deaths" : 0, "wins" : 0 ], "player2" : [ "kills" : 0, "deaths" : 0, "wins" : 0 ] } 周围使用括号?没有括号,为什么它不起作用?我试图在网上找到一些关于它的信息,但没有发现任何信息。

为什么我可以像这样使用它:

my ($digits) = ($str =~ /(\d+)/);

我可以对$digits进行更改吗?像这样:my $digits = ($str =~ /(\d+)/);

1 个答案:

答案 0 :(得分:4)

=表示的两个赋值运算符:

  • 标量赋值运算符。
  • 列表赋值运算符。

Perl根据赋值的左侧(LHS)是否为某种聚合来决定使用哪一个。以下被认为是聚合,这导致使用列表赋值运算符:

  • (...)(括号中的任何表达式)
  • @array
  • @array[...]
  • %hash
  • @hash{...}
  • 上述myourlocal
  • 之前的任何一项

运营商之间存在两个差异。

第一个是评估其操作数的上下文。

  • 标量赋值在标量上下文中计算其两个操作数。
  • 列表赋值在列表上下文中计算其两个操作数。

第二个区别是他们的回归。

  • 标量赋值作为左值评估LHS。
  • 标量上下文中的列表赋值计算为RHS返回的标量数。
  • 列表上下文中的列表赋值将评估LHS返回的标量为左值。

找到示例here

第一个区别在于你的情况。

  • my $digits = $str =~ /(\d+)/;使用标量赋值运算符,该运算符在标量上下文中评估$str =~ /(\d+)/,从而评估/(\d+)/。在标量上下文中,/(\d+)/以及$str =~ /(\d+)/评估匹配是否成功。

  • my ($digits) = $str =~ /(\d+)/;使用列表赋值运算符,该运算符在列表上下文中评估$str =~ /(\d+)/,从而评估/(\d+)/。在列表上下文中,/(\d+)/以及$str =~ /(\d+)/评估匹配所捕获的字符串。