Как удалить элемент массива, на который имеется ссылка?

Я хочу удалить элементы из нескольких больших массивов с помощью подпрограммы. Я использую ссылку, чтобы избежать копирования в подпрограмму.

@a=qw(ok now what is hi the matter);

sub zonk {
  $array=shift; # this is a reference of an array
  foreach $i (0..$#$array) { # I saw some say to avoid last element to get size
    #if (@$array[$i] =~ /hi/) { delete @$array[$i]; }
    #if ($array->[$i] =~ /hi/) { delete $array->[$i]; }
    #if ($array->[$i] =~ /hi/) { delete @$array->[$i]; }
    if ($array->[$i] =~ /hi/) { print "FOUND "; }
    print $array->[$i],"\n";
  }
  @$array = grep{$_} @$array; # removes empty elements
}
zonk(\@a);
print join(':',@a);

Если я запускаю указанную выше программу, я получаю:

ok
now
what
is
FOUND hi
the
matter
ok:now:what:is:hi:the:matter

Но если я использую любую из прокомментированных строк, я получаю:

аргумент удаления не является Элемент или фрагмент HASH в строке 10 hi.pl

Первоначально я пробовал выполнить splice, но затем индексы смещались, что запутало итерацию. Я использую ссылку, чтобы избежать копирования в подписку. @ a = qw (хорошо, в чем дело); sub zonk {$ array = shift; # это ...

Я хочу удалить элементы из нескольких больших массивов с помощью подпрограммы. Я использую ссылку, чтобы избежать копирования в подпрограмму.

@a=qw(ok now what is hi the matter);

sub zonk {
  $array=shift; # this is a reference of an array
  foreach $i (0..$#$array) { # I saw some say to avoid last element to get size
    #if (@$array[$i] =~ /hi/) { delete @$array[$i]; }
    #if ($array->[$i] =~ /hi/) { delete $array->[$i]; }
    #if ($array->[$i] =~ /hi/) { delete @$array->[$i]; }
    if ($array->[$i] =~ /hi/) { print "FOUND "; }
    print $array->[$i],"\n";
  }
  @$array = grep{$_} @$array; # removes empty elements
}
zonk(\@a);
print join(':',@a);

Если я запускаю указанную выше программу, я получаю:

ok
now
what
is
FOUND hi
the
matter
ok:now:what:is:hi:the:matter

Но если я использую любую из прокомментированных строк, я получаю:

аргумент удаления не является Элемент или фрагмент HASH в строке 10 hi.pl

Первоначально я пробовал выполнить splice, но затем индексы смещались, что запутало итерацию. Я использую ссылку, чтобы избежать копирования в подписку. @ a = qw (хорошо, в чем дело); sub zonk {$ array = shift; # это ...

Я хочу удалить элементы из нескольких больших массивов с помощью подпрограммы. Я использую ссылку, чтобы избежать копирования в подпрограмму.

@a=qw(ok now what is hi the matter);

sub zonk {
  $array=shift; # this is a reference of an array
  foreach $i (0..$#$array) { # I saw some say to avoid last element to get size
    #if (@$array[$i] =~ /hi/) { delete @$array[$i]; }
    #if ($array->[$i] =~ /hi/) { delete $array->[$i]; }
    #if ($array->[$i] =~ /hi/) { delete @$array->[$i]; }
    if ($array->[$i] =~ /hi/) { print "FOUND "; }
    print $array->[$i],"\n";
  }
  @$array = grep{$_} @$array; # removes empty elements
}
zonk(\@a);
print join(':',@a);

Если я запускаю указанную выше программу, я получаю:

ok
now
what
is
FOUND hi
the
matter
ok:now:what:is:hi:the:matter

Но если я использую любую из прокомментированных строк вместо этого, я получаю:

аргумент удаления не является Элемент или фрагмент HASH в строке 10 hi.pl

Первоначально я пробовал выполнить splice, но затем индексы смещались, что запутало итерацию. Было бы неплохо узнать все методы, упомянутые в этом посте, однако наиболее эффективным является то, что я ищу :)

Дополнение: Это отлично работает (я имею в виду каждую прокомментированную строку) на моей Linux-машине (ubuntu 9.10, perl 5.10 ), но указанная выше ошибка присутствует на моем компьютере с Windows 7 при работе с perl 5.005_03. Обновление невозможно.

Спасибо

5
задан Shawn 11 December 2010 в 06:42
поделиться