Я столкнулся с несколькими модулями Perl, которые, например, выглядят подобными следующему коду:
package MyPackage;
use strict;
use warnings;
use constant PERL510 => ( $] >= 5.0100 );
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw( );
{ #What is the significance of this curly brace?
my $somevar;
sub Somesub {
#Some code here
}
}
1;
Из чего значение 1;
и фигурных скобок, которые включают $somevar
и Sub?
1
в конце модуля означает, что модуль возвращает истину
для операторов use / require
. Его можно использовать для определения успешной инициализации модуля. В противном случае команда use / require
завершится ошибкой.
$ somevar
- это переменная, доступная только внутри блока. Он используется для моделирования «статических» переменных. Начиная с Perl 5.10, вы можете использовать ключевое слово state
, чтобы получить те же результаты:
## Starting from Perl 5.10 you can specify "static" variables directly.
sub Somesub {
state $somevar;
}
Когда вы загружаете модуль «Foo» с использует Foo
или require ()
, perl выполняет файл Foo.pm
как обычный скрипт. Ожидается, что он вернет истинное значение, если модуль был загружен правильно. Это делает 1;
. Это может быть 2;
или «привет»;
с тем же успехом.
Блок вокруг объявления $ somevar
и функции Somesub
ограничивает область действия переменной. Таким образом, он доступен только из Somesub
и не очищается при каждом вызове Somesub
(что было бы в случае, если бы он был объявлен внутри тела функции). Эта идиома была заменена в последних версиях perl (5.10 и выше), которые имеют ключевое слово state .
Модули Perl должны возвращать то, что оценивается как истина. В противном случае Perl сообщает об ошибке.
C:\temp>cat MyTest.pm
package MyTest;
use strict;
sub test { print "test\n"; }
#1; # commented out to show error
C:\temp>perl -e "use MyTest"
MyTest.pm did not return a true value at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
C:\temp>
Хотя обычно используется «1;», все, что принимает значение true, будет работать.
C:\temp>cat MyTest.pm
package MyTest;
use strict;
sub test { print "test\n"; }
"false";
C:\temp>perl -e "use MyTest"
C:\temp> (no error here)
По очевидным причинам другим популярным возвращаемым значением является 42 .
есть список полезных возвращаемых значений. Модули должны возвращать истинное значение. 1
- истинное значение.
Фигурные скобки ограничивают область действия локальной переменной $ somevar:
{ мой $ somevar; ... } Область действия # $ somevar здесь заканчивается
Из документации для require :
Файл должен возвращать истину как последний заявление для обозначения успешного выполнение любого кода инициализации, так что принято заканчивать такой файл с 1; если вы не уверены, что это будет в противном случае верните истину. Но так лучше просто поставить 1; , если вы добавите другие операторы.
Я мало что знаю о Perl, но обычно вы создаете область видимости, используя фигурные скобки. Возможно, $ somevar не будет доступен глобально?