如何使用perl拼接引用数组?

时间:2012-05-26 17:15:03

标签: perl

如何使用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...
              }
        }
    }

4 个答案:

答案 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
  • 从数组中删除splice和元素之后,索引$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