2012-09-04 2 views
0

У меня есть хэш в файле PERL (позволяет называть его test2.pl) следующим образом:Могу ли я использовать хеш-значения из другого файла?

our %hash1; 

my %hash2 = { 
    one => ($hash1{"zero1"}, $hash1{"one1"} ), 
    two => ($hash1{"one1"}, $hash1{"two1"} ), 
    three => ($hash1{"two1"}, $hash1{"three1"}), 
    four => ($hash1{"three1"}, $hash1{"six1"} ), 
    five => ($hash1{"six1"}, $hash1{"one2"} ), 
    six => ($hash1{"one2"}, $hash1{"two2"} ), 
    last => ($hash1{"two2"}, $hash1{"last1"}), 
}; 

Это становится 6 Use of uninitialized value in anonymous hash ({}) at test2.pl line 7. ошибок (строка 7 в файле соответствует my %hash2 линии и все ошибки говорят строка 7).

Я могу только предположить, что это связано с тем, что %hash1 определен в другом файле (test1.pl), который вызывает этот файл. Я думал, что использовать our будет достаточно, чтобы определить его. Должен ли я инициализировать все переменные хэша для этого?

(я использую скобки с our как есть и другие переменные, я объявивший там.)

+0

@fxzuz Я объяснил в нижней части моего сообщения, почему я использовал скобки вокруг% hash1 после нашего ... Я понимаю, что, с одной стороны, они вам не нужны. – dgBP

+0

'use warnings' дал бы вам понять, в чем проблема. –

ответ

6

В Perl вы определяете хэш, как даже перечисляет. Это означает, что они разделяются круглые скобки не брекет:

my %hash = (
    key1 => "value1", 
    key2 => "value2", 
); 
my $anonHashRef = { 
    key1 => "value1", 
    key2 => "value2", 
}; 

Фигурные скобки создать новый анонимный хэш ссылочный.

Если вы wan't получить доступ к хэш из другого файла, вы должны использовать package декларацию на вершине:

package FooBar; 
# Your %hash comes here 
# it HAS to be GLOBAL, i.e. declared with `our`, not `my` 

Мы можем затем require или use файл (хотя имя файла и пакет предпочтительно быть такой же) и получить доступ к хэш в качестве пакета глобальной:

В вашем главном файле:

use 'file2.pl'; 
my $element = $FooBar::hash{$key}; 

См. Модуль Exporter для более удобного использования структур данных в другом пространстве имен.

+0

oooh, что бы объяснить многое, спасибо! Множество примеров, которые я видел в сети, вместо {) вместо(), и я изучал использование perl в течение примерно 3 дней, поэтому я предположил, что это так. Я тоже смотрел, как делать пакеты, так что двойной бонус! : D привет! – dgBP

+0

bladepanthera: Использование {} вместо() даст вам _reference_ вместо хеша. –

+0

Хотя я согласен с использованием пакетов, я думаю, стоит упомянуть пакет 'main' по умолчанию. Это может быть особенно полезно для доступа к глобальным переменным из других файлов, загружаемых оператором 'do', например. '$ Главная :: myGlobalVarible' – pulven

Смежные вопросы