我使用push
函数将值存储在数组中。数组中的第一个值存储在4个元素而不是第一个元素。例如,在我打印第一个元素$array[1]
时存储值后,它会打印空格/什么,但是当我打印第四个元素$array[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% --