Экспортировать хеш из модуля в скрипт - PullRequest
1 голос
/ 17 февраля 2011

возвращаясь к этой теме , я борюсь с тем, как экспортировать данные из моего модуля. Один способ работает, но не другой, который я хотел бы реализовать.

Вопрос в том, почему не работает второй метод в скрипте? (Я не использовал модуль h2xs, так как думаю, что это только для распространения)

Perl 5.10 / дистрибутив Linux

Модуль my_common_declarations.pm

#!/usr/bin/perl -w  
package my_common_declarations;  
use strict;  
use warnings;

use parent qw(Exporter);  
our @EXPORT_OK = qw(debugme);  

# local datas
my ( $tmp, $exec_mode, $DEBUGME );
my %debug_hash = ( true => 1, TRUE => 1, false => 0, FALSE => 0, tmp=>$tmp, exec=>$exec_mode, debugme=>$DEBUGME );

# exported hash
sub debugme {
return %debug_hash;
}
1;  

Сценарий

#!/usr/bin/perl -w
use strict;  
use warnings;  
use my_common_declarations qw(debugme);  

# 1st Method: WORKS  
my %local_hash = &debugme;  
print "\n1st method:\nTRUE: ". $local_hash{true}. " ou : " . $local_hash{TRUE} , "\n";  

# 2nd Method: CAVEATS  
# error returned : "Global symbol "%debug_hash" requires explicit package name"  
print "2nd method \n " . $debug_hash{true};  

__END__  

Спасибо заранее.

1 Ответ

6 голосов
/ 17 февраля 2011

Вы возвращаете не хеш, а скорее копию хеша. Все хэши, переданные в или из функции, разбиваются на список ключей. Следовательно, копия.

Вместо этого верните ссылку на хеш:

 return \%debug_hash;

Но это открывает ваши внутренние органы внешнему миру. Не очень чистая вещь.

Вы также можете добавить %debug_hash в свой список @EXPORT, но это еще сложнее. Пожалуйста, пожалуйста, используйте только функциональный интерфейс, и вы не пожалеете об этом - и что более важно, никто другой. :)

...