Как удалить ненужные значения из начала массива в Perl? - PullRequest
0 голосов
/ 10 июля 2009

Я храню значения в массиве, используя функцию push. Первое значение в массиве хранится в 4 элементах вместо первого элемента. Например, после сохранения значений, когда я печатаю первый элемент $array[1], он печатает пробел / ничего, но когда я печатаю четвертый элемент $array[4], он печатает первое значение. Любые предложения о том, как удалить ненужные значения в начале массива?

Ответы [ 4 ]

4 голосов
/ 10 июля 2009

Вы можете удалить элементы с начала массива с помощью оператора 'shift'.

Но я думаю, что проблема еще глубже, и вы смотрите на нее неправильно. Если вы храните неизвестные «нежелательные» значения в массиве, вам нужно выяснить, где и почему это происходит, и предотвратить это, а не просто обойти их, чтобы найти то, что вы ищете.

2 голосов
/ 11 июля 2009

Как вы создаете массив? Используя мои удивительные способности ESP, я собираюсь догадаться, что у вас где-то есть split, который ведет пустые поля. Если я ошибаюсь, вам придется рассказать нам больше о том, что вы делаете.

У вас есть небольшая проблема XY здесь. Вы спрашиваете нас, как реализовать решение, которое вы уже выбрали, вместо того, чтобы позволить нам действительно решить проблему.

2 голосов
/ 10 июля 2009
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;
}

& hellip; но было бы лучше не помещать в массив значения "дерьмо".

0 голосов
/ 10 июля 2009

Если вы хотите удалить все нежелательные значения:

@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%          --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...