Я хочу удалить элементы из нескольких больших массивов с помощью подпрограммы. Я использую ссылку, чтобы избежать копирования в подпрограмму.
@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. Обновление невозможно.
Спасибо