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

时间:2014-01-28 08:39:56

标签: regex perl

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

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

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

在示例中,如果$a = 100lkj$x = 100$y = 1

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

我不明白为什么?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

在你的情况下:

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

BTW:$a$bsort的特殊变量。请不要使用它们:)。

($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.

答案 1 :(得分:4)

因为正则表达式测试通常在布尔上下文中使用,所以标量上下文返回总是成功或失败,而不是捕获的值,只有列表上下文会为您提供捕获的值。如果它总是返回捕获的值,则捕获的“0”在布尔测试中看起来会失败。

就我而言,绝对建议尽可能使用返回值;但要这样做,您必须使用列表上下文,例如列表分配。

答案 2 :(得分:1)

在列表模式下,=~返回匹配列表。如果您的$aabc123def456ghi,则第一个表达式将返回(123, 456)。您将这些匹配中的第一个分配给$x

在标量模式下,=~运算符返回找到的匹配数,在您的情况下为1。

要提取值,请不要使用正则表达式运算符的返回值,而是使用$&$1 .. $9变量。