Подтвердить что ты не робот

Что такое "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?

4b9b3361

Ответ 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 недоступен во всем мире?