任何人都可以解释为以下两种语法之间的区别:
($x) = $a =~ /(\d+)/;
$y = $a =~ /(\d+)/;
在示例中,如果$a
= 100lkj
则
$x = 100
但$y = 1
。
使用此代码,我试图提取$a
字符串中的数值。
我不明白为什么?
答案 0 :(得分:6)
在括号内写入变量时,会强制列出上下文。这意味着,您要分配给该变量的内容也将被解释为列表。
在您的情况下,您有正常的匹配。匹配的返回值是一个列表,包含所有匹配项。如果将列表强制转换为标量上下文,则返回此列表中的条目数。所以你有1个匹配,这意味着这个列表包含1个匹配。
不建议使用正则表达式的返回值。
您可以使用变量$1, $2, $3,...
进行匹配(括号中的匹配)。
在你的情况下:
$a =~ /(\d+)/;
$x = $1;
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.
答案 1 :(得分:4)
因为正则表达式测试通常在布尔上下文中使用,所以标量上下文返回总是成功或失败,而不是捕获的值,只有列表上下文会为您提供捕获的值。如果它总是返回捕获的值,则捕获的“0”在布尔测试中看起来会失败。
就我而言,绝对建议尽可能使用返回值;但要这样做,您必须使用列表上下文,例如列表分配。
答案 2 :(得分:1)
在列表模式下,=~
返回匹配列表。如果您的$a
为abc123def456ghi
,则第一个表达式将返回(123, 456)
。您将这些匹配中的第一个分配给$x
。
在标量模式下,=~
运算符返回找到的匹配数,在您的情况下为1。
要提取值,请不要使用正则表达式运算符的返回值,而是使用$&
和$1
.. $9
变量。