如何从Perl中的数组开头删除不需要的值?

时间:2009-07-10 17:12:34

标签: perl arrays

我使用push函数将值存储在数组中。数组中的第一个值存储在4个元素而不是第一个元素。例如,在我打印第一个元素$array[1]时存储值后,它会打印空格/什么,但是当我打印第四个元素$array[4]时,它会打印第一个值。有关如何在数组开头删除不需要的值的任何建议吗?

4 个答案:

答案 0 :(得分:4)

您可以使用'shift'运算符从数组前面删除元素。

但是我觉得这个问题比这个问题更严重,而且你看错了。如果您在数组中存储未知的“不需要的”值,您需要找出发生的位置和原因并阻止它,而不是绕过那些找到您要查找的内容。

答案 1 :(得分:2)

while ( value_meets_shubster_s_definition_of_crap($array[0]) ) {
  shift @array;
}

sub value_meets_shubster_s_definition_of_crap {
  my $value = shift;
  &helip;
  return true or false;
}

...但最好避免首先将“废话”值放到数组上。

答案 2 :(得分:2)

你是如何创建阵列的?利用我惊人的ESP能力,我猜你有一个split某处保持领先的空场。如果我错了,你必须告诉我们你正在做什么。

这里有一点XY问题。您问我们如何实施您已经选择的解决方案,而不是让我们真正解决问题。

答案 3 :(得分:0)

如果您想消除所有不需要的值:

@array = grep { not value_meets_shubster_s_definition_of_crap($_) } @array;

然而,正如David Dorward指出的那样,这也消除了阵列中间的不需要的值。要仅删除开头的值,您可以使用List::MoreUtils中的first_index,这可能比shift的循环更有效:

#!/usr/bin/perl

use strict;
use warnings;

use List::MoreUtils qw( first_index );

my @array = ( 0, 1, 0, 2 );
my $begin = first_index { not is_unwanted($_) } @array;

@array = @array[ $begin .. $#array ];

print "@array\n";

sub is_unwanted {
    my ($v) = @_;
    return if $v;
    return 1;
}

__END__

输出:

C:Temp> yjk
1 0 2

更新:我的预感似乎错了:

#!/usr/bin/perl

use strict;
use warnings;

use Benchmark qw( cmpthese );
use List::MoreUtils qw( first_index );

my @array = ( 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9 );

cmpthese -10, {
    'first_index' => \&using_first_index,
    'shift'       => \&using_shift,
    'nop'         => \&nop,
};

sub using_first_index {
    my @result = @array;
    my $begin = first_index { not is_unwanted($_) } @result;
    @result = @result[ $begin .. $#result ];
}

sub using_shift {
    my @result = @array;
    shift @result while is_unwanted($result[0]);
}

sub nop { my @result = @array; }

sub is_unwanted {
    my ($v) = @_;
    return if $v;
    return 1;
}

结果:

                Rate first_index       shift         nop
first_index  75767/s          --        -71%        -89%
shift       258810/s        242%          --        -61%
nop         664021/s        776%        157%          --