Доступ к глобальному хешу в подпрограмме на Perl

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

Я объявил это как:

`%HASH = ();`

и пытаюсь получить к нему доступ в подпрограмме как:

$HASH{$key} = $value;

Я делаю что-то неправильно?


person iDev    schedule 25.10.2012    source источник
comment
Объявлен ли хэш перед подпрограммой в том же файле? У вас включены use strict и use warnings? Опубликуйте еще код   -  person didster    schedule 26.10.2012
comment
Покажите соответствующий код, демонстрирующий вашу проблему.   -  person TLP    schedule 26.10.2012
comment
Спасибо, ребята, за вашу помощь. Я проталкивал хэш-значение в массив, используя: push (@{$HASH{$key}}, $value) и не сортировал свой массив, поэтому не мог найти значение, и мне казалось, что он не может получить к нему доступ. Моя беда, спасибо за помощь :)   -  person iDev    schedule 26.10.2012
comment
@iDev Вы не pushете в массиве, а в (анонимном) массиве ссылаетесь ВНУТРИ вашего хэша. Обратите внимание, что он будет создан, если он не существует. Чтобы узнать больше, посмотрите вывод Data::Dumper для вашего хэша. Узнайте больше о ссылках в perlreftut. Почти во всех ситуациях useобозначение strict и предупреждения помогают найти неверный контент. Подробнее   -  person memowe    schedule 26.10.2012
comment
Спасибо memowe .. Это было информативно! :)   -  person iDev    schedule 31.10.2012


Ответы (1)


Здесь работает нормально:

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

our %truth = (); # "global" truth: lexical name
                 # for the package variable %main::truth

sub add_to_truth {
    my ($thing, $value) = @_;
    $truth{$thing} = $value;
}

add_to_truth(answer => 42);
say $truth{answer};

Вывод:

42

Обратите внимание, что в разделе strictures вы должны полностью указать свои "глобальные" переменные с их именем пакета (в данном случае %main::truth) или создать лексически локальное имя для них с нашим. А сегодня программировать без ограничений (и предупреждений) — это нехорошо™. На самом деле, их активация сказала бы вам что-то полезное.

person memowe    schedule 25.10.2012
comment
Является ли «наш» строго необходимым в этой ситуации? Я попробовал это с «мой», и это тоже сработало. Насколько я понимаю, «наш» используется, когда вы хотите поделиться этим со всем пакетом. - person tu-Reinstate Monica-dor duh; 10.06.2016