( -6ren">
gpt4 book ai didi

regex - 报价 - 捕获 - 问题

转载 作者:行者123 更新时间:2023-12-04 17:27:31 30 4
gpt4 key购买 nike

有人可以解释一下,为什么我可以使用 $1两次得到不同的结果?

perl -wle '"ok" =~ /(.*)/; sub { "huh?" =~ /(.*)/; print for @_ }->( "$1", $1 )'

(发现于: How to exclude submatches in Perl?)

最佳答案

@_参数数组的行为与您认为的不同。 @_ 中的值在子程序中实际上是 aliases for the real arguments :

The array @_ is a local array, but its elements are aliases for the actual scalar parameters.



当你这样说时:
sub s {
"huh?" =~ /(.*)/;
print for @_;
}

"ok" =~ /(.*)/;
s("$1", $1);
$1s 的第一个参数中立即由字符串插值计算,但不计算第二个参数,只是注意到子版本中的第二个值 @_$1 (实际变量 $1 ,而不是它的值)。然后,在 s 里面, $1的值由您的正则表达式更改。现在,您的 @_具有字符串 "ok" 的别名后跟 $1 的别名,这些别名由 print 解析在你的循环中。

如果您将功能更改为:
sub s {
my @a = @_;
"huh?" =~ /(.*)/;
print for @a;
}

甚至这个:
sub s {
local $1;
"huh?" =~ /(.*)/;
print for @_;
}

然后你会得到你期望的两行“ok”。搞笑(搞笑奇葩,不搞笑哈哈)就是这两个版本 s由于不同的原因产生您的预期结果。 my @a = @_; version 提取 @_ 中别名的当前值在正则表达式开始使用之前 $1 ; local $1; version本地化 $1将别名保留在 @_ 中的子变量引用 $1 的版本从子外部:

A local modifies the listed variables to be local to the enclosing block, file, or eval.



像这样的奇怪现象就是为什么您应该始终尽快将编号的正则表达式捕获变量的值复制到您的变量中,以及为什么要解压缩 @_就在您的函数开始时(除非您知道为什么不想这样做)。

希望我没有过多地使用术语,这是我一直远离的 Perl 那些奇怪的角落之一,因为我不喜欢杂耍 Blade 。

关于regex - 报价 - 捕获 - 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6000082/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com