Что такое "1"; означает в Perl?
Я столкнулся с несколькими модулями 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
1
в конце модуля означает, что модуль возвращает true
в use/require
. Его можно использовать, чтобы определить, успешна ли инициализация модуля. В противном случае use/require
завершится с ошибкой.
$somevar
- это переменная, доступная только внутри блока. Он используется для имитации "статических" переменных. Начиная с Perl 5.10 вы можете использовать ключевое слово state
, чтобы иметь те же результаты:
## Starting from Perl 5.10 you can specify "static" variables directly.
sub Somesub {
state $somevar;
}
Ответ 2
Когда вы загружаете модуль "Foo" с помощью use Foo
или require()
, perl выполняет файл Foo.pm
, как обычный script. Он ожидает, что он вернет истинное значение, если модуль был загружен правильно. 1;
делает это. Это также может быть 2;
или "hey there";
.
Блок вокруг объявления $somevar
и функция Somesub
ограничивает область действия переменной. Таким образом, он доступен только из Somesub
и не очищается при каждом вызове Somesub
(что было бы так, если бы оно было объявлено внутри тела функции). Эта идиома была заменена в последних версиях perl (5.10 и выше), которые имеют ключевое слово state.
Ответ 3
Модули должны возвращать истинное значение. 1
- истинное значение.
Ответ 4
Модули Perl должны возвращать значение, которое имеет значение true. Если они этого не делают, 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.
Там список прохладных значений возврата, сохраненных в http://returnvalues.useperl.at/values.html.
Ответ 5
Кожные фигурные скобки ограничивают область локальной переменной $somevar:
{ мой $somevar;
...
} # $somevar scope заканчивается здесь
Ответ 6
Из документации для require:
Файл должен возвращать true в качестве последнего для подтверждения успешного выполнение любого кода инициализации, поэтому обычно заканчивается такой файл с 1; если вы не уверены, что это будет return true в противном случае. Но это лучше просто поставить 1;, если вы добавите больше заявлений.
Ответ 7
Я не знаю много о Perl, но обычно вы создаете область с использованием фигурных скобок. Вероятно, $somevar недоступен во всем мире?