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

Regex 括号如何更改正则表达式匹配的结果?,regex,perl,Regex,Perl,有人能解释一下以下两种语法之间的区别吗: ($x) = $a =~ /(\d+)/; $y = $a =~ /(\d+)/; 在本例中,如果$a=100lkj,则 $x=100但$y=1 使用此代码,我试图提取$a字符串中的数值 我不太明白为什么 在列表模式下,=~返回匹配项列表。如果$a是abc123def456ghi,则第一个表达式将返回(123456)。将这些匹配项中的第一个指定给$x 在标量模式下,=~运算符返回找到的匹配数,在您的情况下为1 要提取值,请不要使用regex运算符的返

有人能解释一下以下两种语法之间的区别吗:

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

$y = $a =~ /(\d+)/;
在本例中,如果
$a
=
100lkj
,则
$x=100
$y=1

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


我不太明白为什么

在列表模式下,
=~
返回匹配项列表。如果
$a
abc123def456ghi
,则第一个表达式将返回
(123456)
。将这些匹配项中的第一个指定给
$x

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


要提取值,请不要使用regex运算符的返回值,而是使用
$&
$1
<代码>$9变量。

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

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

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

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

就你而言:

$a =~ /(\d+)/;
$x = $1;
顺便说一句:
$a
$b
排序的特殊变量。请不要使用它们:)


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


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

为什么不建议使用正则表达式的返回值?没有数组上下文。看,是的。你说得对。我刚刚意识到
搜索字符串以查找模式匹配,在标量上下文中,如果搜索成功,则返回true;如果搜索失败,则返回false。
Re“不建议使用正则表达式的返回值。”?!?!?!?!?!恰恰相反。我不喜欢使用全局变量,所以我强烈推荐它。此外,在使用
$1
之前,代码没有检查匹配是否成功,因此它可能包含垃圾。如果要避免使用返回值,则必须使用
my$x=$a=~/(\d+)/$1:未定义而不是
my($x)=$a=~/(\d+)/。但这很愚蠢,因为没有/g标志,所以它不会尝试多次匹配
($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.