gpt4 book ai didi

perl - 使用 "for"对变量进行局部化显然是不好的。为什么?

转载 作者:行者123 更新时间:2023-12-01 06:48:52 25 4
gpt4 key购买 nike

所以 I answered a question on SO and got a lot of flack for it .我已经使用 Perl 很多年了,并且经常使用这个话题。

那么让我们从一些代码开始吧。我在这些例子中进行搜索和替换。这个想法是从两个字符串中搜索 onethree 并替换它们。

$values = 'one two three four five';
$value2 = 'one 2 three four 5';

$values =~ s/one//g;
$values =~ s/three//g;

$values2 =~ s/one//g;
$values2 =~ s/three//g;

这段代码很简单,大家都接受。

我还可以使用要搜索和替换的值列表构建一个数组或散列,这也是可以接受的。

但是,当我构建一个脚本来主题化 $values$values2 并减少构建脚本的输入量时,它似乎被误解了吗?

这是代码。

$values = 'one two three four five';
$value2 = 'one 2 three four 5';

for ( $values, $values2 ) {
s/one//g;
s/three//g;
}

上面的代码将在 for block 的持续时间内对变量进行主题化,但是许多程序员反对这样做。我想了解为什么这是 Not Acceptable ?

最佳答案

有几点需要考虑。


您的代码对变量列表执行多个替换。您可以在不使用 $_ 的情况下做到这一点:

for my $s ($values, $values2) {
$s =~ s/one//g;
$s =~ s/three//g;
}

个人认为上面的代码没有什么问题。

$_ 的一般问题是它不是局部变量。例如。如果你的 body for循环调用一个函数(调用一个函数...)修改 $_如果不对其进行本地化(例如,通过分配给它或使用裸 s/// 或使用 while (<...>) ),它将覆盖您正在迭代的变量。用my您受到保护的变量,因为其他函数看不到您的局部变量。

就是说,如果您的其余代码没有此错误(在没有本地化的情况下乱写 $_),$_将在这里正常工作。


但是,人们最初提示的答案中的代码是不同的:

for ($brackets) {
s/\\left/(/g;
s/\\right/)/g;
}

在这里,您并不是要对许多变量执行相同的替换;你只是通过摆脱 $brackets =~ 来节省一些打字时间部分:

$brackets =~ s/\\left/(/g;
$brackets =~ s/\\right/)/g;

使用显式循环变量不是解决方案,因为您仍然需要输入 $foo =~在每一行。

这更像是一个品味问题。你只使用 for因为它的别名效果,而不是循环多个值。就我个人而言,我仍然同意这一点。

关于perl - 使用 "for"对变量进行局部化显然是不好的。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44082720/

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