如何使用perl拼接参考数组?我正在尝试从函数中使用的引用数组中删除某些元素。
&removeELement(@spliceArray);
sub removeELement
{
my $ref_to_spliceArray = shift;
foreach my $i (0 .. $#$ref_to_spliceArray)
{
if($ref_to_spliceArray->[$i] == /failed/)
{
splice $ref_to_spliceArray->[$i],1; # this syntax does not work...
}
}
}
答案 0 :(得分:1)
您可以通过对代码进行一些更改来获得所需的行为。
0 .. $#ref_to_spliceArray
。=~
而不是==
。splice
,而不是数组的单个元素。以下代码修复了这些问题。
sub removeElement
{
my $ref_to_spliceArray = shift;
my $i = 0;
while ($i <= $#$ref_to_spliceArray)
{
if (defined $ref_to_spliceArray->[$i]
&& $ref_to_spliceArray->[$i] =~ /failed/)
{
splice @$ref_to_spliceArray, $i, 1;
}
else {
++$i;
}
}
}
将您的通话修改为
&removeElement(\@spliceArray);
请注意,这种语法对现代人来说显得过时了。考虑整个阵列的操作,而不是一次偷看和戳一个元素。在这个简单的例子中,你不需要去定义另一个子的麻烦。
@spliceArray = grep !(defined && /failed/), @spliceArray;
也就是说,@spliceArray
应该只包含那些与正则表达式不匹配的元素。 defined
检查会阻止警告@spliceArray
中可能存在的未定义值。
答案 1 :(得分:0)
为了正确使用splice
,我建议您查看splice
man page。
如果使用引用,只需取消引用它:@$aref
而不只是$aref
。
要解决手头的问题,请考虑使用grep
。以下是使用Windows(双引号!)命令行的示例:
perl -lwe "$x = [qw/a b failed d/]; print for grep ! m/failed/, @$x"
还有一件事:使用包含=~
和!~
的正则表达式,而不是==
。
你正在使用strict
,不是吗?总是use strict
,总是!
答案 2 :(得分:0)
您可以简单地使用grep
:
my @array = qw/foo bar baz qux/;
@array = grep { ! m/baz/ } @array;
# @array now contains foo bar qux
您的代码有几个错误:
==
与=~
splice $@aray, $i, 1
)$i
将不正确,因为您从数组中删除了item,并且您将检查数组中不存在的元素。答案 3 :(得分:0)
尝试从正在迭代的列表中删除元素通常是个坏主意。尝试使用grep
创建一个新列表,其中仅包含您要保留的元素,并分配回原始参考。
sub removeElement {
my $ref_to_Array = shift;
@$ref_to_Array = grep { ! /failed/ } @$ref_to_array;
}
&removeElement(\@someArray);
请注意,您需要将引用传递给您的数组。
顺便说一下,你可能正在寻找splice
的电话是
splice @$ref_to_spliceArray, $i, 1