gpt4 book ai didi

perl - 有没有一种简单的方法来本地化(保留)所有 "magic variables"(如$ 1,$&等)?

转载 作者:行者123 更新时间:2023-12-04 03:41:40 25 4
gpt4 key购买 nike

我知道在Perl的子例程中,最好在执行任何操作之前先将$_保留为“默认变量” local,以防万一调用方正在使用它,例如:

sub f() {
local $_; # Ensure $_ is restored on dynamic scope exit
while (<$somefile>) { # Clobbers $_, but that's OK -- it will be restored
...
}
}

现在,通常首先使用 $_的原因是因为您想使用正则表达式,这可能会将结果放在方便的“魔术”变量中,例如 $1$2等。 我也想保留这些变量,但是我没有无法找到一种方法来做到这一点。

perlvar所说的全部是 @+等似乎在内部依赖的 @-$1,指的是“当前事件动态范围中的最后成功的子匹配项”。但这甚至与我的实验相矛盾。根据经验,下面的代码会像我希望的那样显示“aXaa”:
$_ = 'a';
/(.)/; # Sets $1 to 'a'
print $1; # Prints 'a'
{
local $_; # Preserve $_
$_ = 'X';
/(.)/; # Sets $1 to 'X'
print $1; # Prints 'X'
}
print $_; # Prints 'a' ('local' restored the earlier value of $_)
print $1; # Prints 'a', suggesting localising $_ does localise $1 etc. too

但是真正令我惊讶的是,至少在我的ActivePerl 5.10.0中, 注释掉local行仍然保留了$1 ,即产生了答案“aXXa”!括号括起来的块的词汇(非动态)范围似乎在某种程度上保留了 $1的值。

因此,我觉得这种情况充其量是令人困惑的,并且希望听到明确的解释。请注意,我实际上会选择一种防弹的方式来保留所有与正则表达式相关的魔术变量,而不必像下面那样枚举所有变量:
local @+, @-, $&, $1, $2, $3, $4, ...

这显然是令人作呕的骇客。在此之前,我将担心我触摸的任何正则表达式都会破坏调用者不希望被破坏的东西。

谢谢!

最佳答案

也许您可以为文档建议一个更好的措辞。动态范围是指直到封闭块或子例程开始的所有内容,再加上直到该块或子例程调用的开始的所有内容,等等,除了排除所有封闭的块。

另一种说法是:“当前事件的动态范围中最后成功的子匹配项”表示每个变量的每个块的开头都隐含一个local $x=$x;

关于动态范围的大多数提及(例如http://perldoc.perl.org/perlglossary.html#scopehttp://perldoc.perl.org/perlglossary.html#dynamic-scoping)
正在从另一种方式接近它。如果您认为成功的话,它们就会适用
正则表达式隐式地做local $1

关于perl - 有没有一种简单的方法来本地化(保留)所有 "magic variables"(如$ 1,$&等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236756/

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