Если вы хотите удалить все нежелательные значения:
@array = grep { not value_meets_shubster_s_definition_of_crap($_) } @array;
Однако, как отметил Дэвид Дорвард, это также исключает нежелательные значения из середины массива. Чтобы избавиться только от значений в начале, вы можете использовать first_index
из List :: MoreUtils , который может быть более эффективным, чем цикл shift
s:
#!/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% --