So 我在 SO 上回答了一个问题,但遭到了很多批评 https://stackoverflow.com/a/44046189/1848654。
我使用 Perl 已经很多年了,而且经常使用这个主题。
让我们从一些代码开始。我在这些示例中进行搜索和替换。想法是寻找one
and three
从两个字符串中取出并替换它们。
$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
and $values2
并减少构建脚本的打字量,这似乎被误解了?
这是代码。
$values = 'one two three four five';
$value2 = 'one 2 three four 5';
for ( $values, $values2 ) {
s/one//g;
s/three//g;
}
上面的代码将在持续时间内对变量进行主题化for
块,但许多程序员反对这一点。我想了解为什么这是不可接受的?
有几点需要考虑。
您的代码对变量列表执行多次替换。您无需使用即可做到这一点$_
:
for my $s ($values, $values2) {
$s =~ s/one//g;
$s =~ s/three//g;
}
我个人认为上面的代码没有什么问题。
一般问题是$_
是它不是局部变量。例如。如果你的身体for
循环调用一个函数(调用一个函数...)来修改$_
无需本地化它(例如,通过分配给它或使用裸s///
或使用while (<...>)
),那么它将覆盖您正在迭代的变量。与一个my
您的变量受到保护,因为其他函数无法看到您的局部变量。
也就是说,如果你的其余代码没有这个错误(乱写$_
没有本地化),$_
在这里会工作得很好。
然而,人们最初抱怨的答案中的代码是不同的:
for ($brackets) {
s/\\left/(/g;
s/\\right/)/g;
}
在这里,您并不是试图对许多变量执行相同的替换;而是尝试对多个变量执行相同的替换。你只是通过摆脱$brackets =~
part:
$brackets =~ s/\\left/(/g;
$brackets =~ s/\\right/)/g;
使用显式循环变量不是解决方案,因为您仍然需要输入$foo =~
在每一行。
这更多是一个品味问题。你只使用for
为了它的混叠效果,不要循环多个值。就我个人而言,我对此还是很满意的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)