Удаление пар ключ / значение из результата perl в глобальном символе требует явной ошибки имени пакета - PullRequest
0 голосов
/ 25 января 2012

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

my $hash = foo();

затем я хэш, используя эту строку кода:

while (my ($key, $value) = each %$hash)

и в блоке я выбираю ненужные значения и сохраняю ключи для этих значений в массиве, который был объявлен так (перед циклом, конечно):

my @keysArray = ();

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

for my $key (@keysArray){
    delete $hash{$key};# this line of code is causing the problem
}

Последняя строка, которую я написал, вызывает глобальный символ "% hash", требует явного исключения имени пакета.

Любые исправления или я здесь что-то не так делаю.

P.S. Я изменил имена переменных и удалил другой внутренний код, но формат тот же.

Помогите пожалуйста! Спасибо.

Ответы [ 3 ]

9 голосов
/ 25 января 2012

delete $hash{$key} удаляет запись из %hash.Там нет %hash.Вместо этого вы хотите написать delete $hash->{$key}, который удаляет запись из %$hash.

. Я предлагаю perldoc perlreftut , чтобы ответить на все ваши вопросы о ссылках и как их использовать.*

3 голосов
/ 25 января 2012

Вы объявили $hash (скалярная ссылка на хеш), но не %hash (хеш).Попробуйте вместо этого delete $hash->{$key}.

1 голос
/ 25 января 2012

Ваш (восстановленный) код:

for my $key (@keysArray) {
    delete $hash->{$key};
}

может быть сокращен до

for my $key (@keysArray) {
    delete $$hash{$key};
}

или просто

delete @$hash{@keysArray};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...