括号如何改变正则表达式匹配的结果?

use*_*523 4 regex perl

任何人都可以解释为以下两种语法之间的区别:

($x) = $a =~ /(\d+)/;

$y = $a =~ /(\d+)/;
Run Code Online (Sandbox Code Playgroud)

在示例中,if $a= 100lkjthen $x = 100but $y = 1.

使用此代码,我试图提取$a字符串中的数值.

我不明白为什么?

小智 6

在括号内写入变量时,会强制列出上下文.这意味着,您要分配给该变量的内容也将被解释为列表.

在您的情况下,您有一个正常的匹配.匹配的返回值是一个列表,包含所有匹配项.如果将列表强制转换为标量上下文,则返回此列表中的条目数.所以你有1个匹配,这意味着这个列表包含1个匹配.

不建议使用正则表达式的返回值.

您可以使用变量$1, $2, $3,...进行匹配(括号中的匹配).

在你的情况下:

$a =~ /(\d+)/;
$x = $1;
Run Code Online (Sandbox Code Playgroud)

BTW:$a并且$b是特殊的变量sort.请不要使用它们:).

($x) = $a =~ /(\d+)/;
# $x is the first element of the RegEx return value
# ($x, $y, $z) = $a =~ /(\d)(\d)(\d)/;
# $x = first match, $y = second and so on.
Run Code Online (Sandbox Code Playgroud)