2016-01-15 5 views
1

У меня есть хэш, который присутствует в главном скрипте perl (.pl). Я хочу, чтобы хэш был вискось для модулей (.pm), которые вызывается в главном скрипте perl. Как я могу объявить его глобально? Является ли это возможным?Глобально объявить хэш в perl

+6

Это [XY Проблема] (HTTP: // мета. stackexchange.com/questions/66377/what-is-the-xy-problem). Что вы пытаетесь достичь? Но это уже глобально видно, если вы объявляете его через 'our' - вам может потребоваться указать пространство имен для доступа к нему (и это плохая идея). – Sobrique

+3

Возможно, лучше передать ссылку на этот хэш на функции в ваших модулях. Или, если модули являются классами, добавьте ссылку на этот хэш к созданным объектам. – jcaron

ответ

4

Прежде всего - это плохая идея. Глобалы или супер-глобалы, такие как вы ищете, приводят кодекс со сложными зависимостями повсюду - то, что вы делаете , пытаясь избежать, используя модули в первую очередь.

Однако - вы можете объявить переменную с our, а затем получить к ней доступ через имя пакета.

our %thing = (key => "value"); 
print Dumper \%main::thing; 

Это видно в другом месте пространства имен с полным именем и модулем.

(Если вы действительно должны, вы можете начать трахаться с TYPEGLOBs, но поверьте мне, когда я говорю, что это плохая идея).

4

Это нарушает множество правил хорошего программного обеспечения, но возможно использование переменных пакета.

В hash.pl:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use MyHashModule; 

our %hash = (one => 1, two => 2, three => 3); 

say hashkeys(); 

В MyHashModule.pm

package MyHashModule; 

use strict; 
use warnings; 

use base 'Exporter'; 
our @EXPORT = qw[hashkeys]; 

sub hashkeys { 
    return keys %main::hash; 
} 

1; 

Но я не могу повторить то, что достаточно страшная мысль это. Если бы вы объяснили больше о том, что вы на самом деле пытаетесь сделать, мы, возможно, придумаем решение, которое намного более безопасно.

0

Настоятельно рекомендуется рассматривать локальные переменные, в отличие от глобальных переменных, по возможности. Если вам нужно только написать небольшой скрипт, могут возникнуть проблемы с объявлением глобальной переменной, но по мере увеличения сценария или если вы или другой разработчик добавили больше функциональности, может быть трудно найти логические ошибки, которые ползут . в

Это, как говорится, если вы должны объявить глобальную переменную, вы бы просто изменить my к our, например:

our %global_variable = (key => "value"); 
Смежные вопросы