2010-11-10 3 views
0

Каковы различия (если таковые имеются) для меня, как пользователь пакета «Test :: Test» между этими двумя пакет-версии:пакет переменной декларирование вопрос

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 
use strict; use warnings; 

our $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

.

Test::Test; 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw(hello); 

$c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

ответ

4

Рекомендуется всегда включать strict и warnings. Эти прагмы помогают поймать множество простых ошибок и опечаток.

Эти два образца эквивалентны. Но первый из них предпочтителен, потому что он явно объявляет глобальную переменную $c с использованием our и включает строгие и предупреждающие сообщения.

1

Переменные в perl по умолчанию глобальны, независимо от того, объявлены они в модуле или нет. «Мои», «Местные» и «Наши» ключевые слова охватывают переменную по-разному. В вашем примере «наш $ c» ограничивает видимость переменной в вашем пакете (если вы не решили ее экспортировать, но это еще одна история).

Итак, для вашего последнего примера любой код фрагмента, который получает доступ и изменяет $ c, также повлияет на ваш код.

См. http://perldoc.perl.org/functions/our.html для официальной документации по ключевому слову «наше».

+6

Это не очень точно. '$ c' - это пакет глобальный (' $ Test :: Test :: c') с или без 'our', и любой, в пакете или без него, может получить к нему доступ под этим именем. Однако при включенном 'strict 'vars'' вы не можете просто называть его' $ c' даже в 'Test :: Test', если исключение не сделано с использованием' use vars' или лексический псевдоним создается с помощью 'our' , 'my' и' local', конечно, делают совершенно разные вещи. – hobbs

+3

См. Также http://stackoverflow.com/questions/3626190/why-are-variables-declared-with-our-visible-across-files/3626333#3626333 для дальнейшего объяснения того, что именно мы делаем, как это отличается из 'use vars', и почему это не просто означает« сделать это видимым в этом пакете ». – hobbs

+0

Правильно, это сочетание «использовать строгое» и «наше», что является значительным. Используя строгие силы, программист объявляет переменную и, таким образом, рассматривает область действия. –

3

FWIW, то собственно способ, чтобы написать этот модуль, как это:

package Test::Test; 
use strict; 
use warnings; 

use Exporter 'import'; # gives you the import method directly 
our @EXPORT = qw(hello); 

my $c = 3; 
sub hello { 
    print "$_\n" for 0 .. $c; 
} 

См perldoc Exporter для лучших практик по написанию модулей с экспортом, для различных сценариев.

Я также предлагаю изменить имя этого пакета, поскольку пространство имен Test :: уже используется базовыми модулями и дистрибутивами CPAN.

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