perl - 使用条件拼接可以吗?
问题描述
让我们考虑一下简单的 Perl 代码:
my @x = ( 1, 5, 9);
for my $i ( 0 .. $#x ) {
splice( @x, $i, 1 ) if ( $x[$i] >= 5 );
}
print "@x";
输出不正确,1 9
但一定有1
如果我们运行带有-w
标志的代码,它会打印警告
Use of uninitialized value within @x in numeric ge (>=) at splice.pl line 5.
那么,使用条件拼接并更好地将结果推送到新变量不是一个好习惯吗?
解决方案
问题不在于您使用条件splice
本身,而在于您的循环。最明显的问题,也是导致您发出警告的问题,是您正在耗尽数组的末尾。for my $i ( 0 .. $#x )
将迭代端点设置为循环开始$#x
之前,但是在拼接一个或多个元素后,数组的最后一个索引会更小。你可以使用 C 风格的for
循环而不是范围风格的循环来解决这个问题,但我不推荐它——继续阅读。
下一个问题是,从数组中拼接出一个元素后,继续循环更高$i
... . 你说“输出是正确的”,但不应该被删除,因为它超过 5?您可以使用after来解决此问题,以再次通过循环而不增加,但我也不建议这样做。$x[$i]
$x[$i+1]
1 9
9
redo
splice
$i
因此,可以修复在适当位置使用的循环splice
,使其正常工作,但结果会非常复杂。除非有令人信服的理由采取不同的做法,否则我建议您简单地使用
@x = grep { $_ < 5 } @x;
将结果分配给与源相同的数组没有问题,并且您无需进行循环管理或其他内务处理。
推荐阅读
- python - TypeError: cannot pickle '_io.TextIOWrapper' object and EOFError: Ran out of input when call a function using multiprocessing.Process
- bind - 如何在 @Body 中使用 @bind-PropertyName
- mysql - SQL 查询在 shell 脚本中不起作用
- linux - 无法在监视器中启动脚本
- java - 在java中打印整数的语法是什么
- javascript - 将 post 请求转换为 JSON 文件
- javascript - 控制台日志中的Javascript过滤器数组按升序排列
- php - .htaccess 从带有数字参数的 URL 重定向到带有文本参数的 URL
- python - 在 Python 中查找和连接具有多个列名的数据框
- php - 究竟是什么导致了这个 PHP 代码中的错误?