gpt4 book ai didi

perl - 使用条件拼接可以吗?

转载 作者:行者123 更新时间:2023-12-05 01:08:33 30 4
gpt4 key购买 nike

让我们考虑简单的 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 不是好的做法更好地将结果推送到新变量中?

最佳答案

问题不是您使用条件 splice 本身,而是您的循环。最明显的问题,也是导致您发出警告的问题,是您正在运行数组的末尾。 for my $i ( 0 .. $#x ) 将迭代端点设置为 $#x 在循环开始之前,但在你拼接之后一个或多个元素出来,数组的最后一个索引会更小。您可以使用 C 风格的 for 循环来解决这个问题,而不是使用范围风格的循环,但我不推荐这样做——请继续阅读。

下一个问题是,当你从数组中拼接出一个元素后,你继续循环 $i 一个更高的......但是因为你从数组中拼接了一个元素,下一个您还没有看到的元素在 $x[$i] 中, $x[$i+1]。您说“输出正确,1 9”,但是 9 不应该被删除吗,因为它大于 5?您可以在 splice 之后使用 redo 来修复此问题,以便在不增加 $i 的情况下再次执行循环,但我也不建议这样做。

因此,可以修复使用 splice 的循环,使其正常工作,但结果会非常复杂。除非有令人信服的理由以不同的方式来做,否则我建议简单地使用

@x = grep { $_ < 5 } @x;

将结果分配给与源相同的数组没有问题,并且您无需进行循环管理或其他内务处理。

关于perl - 使用条件拼接可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54011282/

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