2009-07-10 74 views
0

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

+3

你在推动你的阵列?这可能是问题所在。听起来就像你在推动另一个数组而不是推动标量。顺便说一下,第一个元素位于索引0,而不是1。 – jeje 2009-07-10 17:20:28

+0

@ jeje:匹配正则表达式后,我正在推入值。像这样:push(@value,join(“”,$ file =〜/ $ find /)) – shubster 2009-07-10 17:46:23

+0

@shubster好的,所以你在你的数组@value中推入一个数组(显然是5个元素)。 – jeje 2009-07-10 18:02:11

回答

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; 
} 

…但最好避免将“垃圾”值放在阵列上。

0

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

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

然而,正如戴维·多沃德指出,这消除不需要的值从数组中间为好。要在开始摆脱只有值,则可以使用first_indexList::MoreUtils这可能是比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%   -- 
4

您可以使用'shift'运算符从阵列的前部移除元素。

但我认为这个问题比这个更深,而你却以错误的方式看待它。如果您在数组中存储未知的'不想要的'值,您需要找出发生的地点和原因并防止它发生,而不是绕过这些找到您要查找的内容。

2

你是如何创建数组?使用我的惊人的ESP的力量,我猜测你有一个split的地方,保持领先的空场地。如果我错了,你必须告诉我们更多关于你在做什么。

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