2009-07-10 75 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的問題。您在問我們如何實施您已經選擇的解決方案,而不是讓我們真正解決問題。