Я хочу удалить элементы из нескольких больших массивов с помощью подпрограммы. Я использую ссылку, чтобы избежать копирования в подпункте.
@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
Но если вместо этого я буду использовать любую из закомментированных строк, я получу:
аргумент delete не является элементом или фрагментом HASH в строке hi.pl 10.
Первоначально я пытался сращивать, но затем индексы сместились и запутали итерацию.
Было бы неплохо узнать все методы, упомянутые в этом посте, однако наиболее эффективным является то, что я ищу:)
Приложение: Это прекрасно работает (я имею в виду каждую закомментированную строку) на моей машине с Linux (Ubuntu 9.10, Perl 5.10), но вышеупомянутая ошибка на моем компьютере с Windows 7 при работе с Perl 5.005_03
Обновление не вариант.
Спасибо