вопрос объявления переменной пакета - PullRequest
0 голосов
/ 10 ноября 2010

Каковы различия (если таковые имеются) для меня как пользователя пакета "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;
}

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

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

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

3 голосов
/ 10 ноября 2010

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.

1 голос
/ 10 ноября 2010

Переменные в perl по умолчанию являются глобальными, независимо от того, объявлены они в модуле или нет. Ключевые слова "my", "local" и "our" определяют переменную по-разному. В вашем примере «наш $ c» ограничивает видимость переменной для вашего пакета (если вы не решили экспортировать ее, но это уже другая история).

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

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

...