Что значит "1;" значит в Perl? - PullRequest
33 голосов
/ 21 декабря 2009

Я столкнулся с несколькими модулями 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?

Ответы [ 7 ]

66 голосов
/ 21 декабря 2009

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;
}
11 голосов
/ 21 декабря 2009

Когда вы загружаете модуль "Foo" с помощью use Foo или require(), perl выполняет файл Foo.pm как обычный скрипт. Ожидается, что он вернет истинное значение, если модуль был загружен правильно. 1; делает это. Это также может быть 2; или "hey there";.

Блок вокруг объявления $somevar и функции Somesub ограничивает область действия переменной. Таким образом, он доступен только из Somesub и не очищается при каждом вызове Somesub (что было бы в случае, если оно было объявлено внутри тела функции). Эта идиома была заменена в последних версиях Perl (5.10 и выше), которые имеют ключевое слово state .

8 голосов
/ 21 декабря 2009

Модули 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.

8 голосов
/ 21 декабря 2009

Модули должны возвращать истинное значение. 1 является истинным значением.

4 голосов
/ 21 декабря 2009

Из документации на требуется :

Файл должен возвращать true как последний заявление, чтобы указать успешное выполнение любого кода инициализации, поэтому обычно заканчивать такой файл с 1; если вы не уверены, что это будет в противном случае верните истину. Но лучше просто поставить 1; в случае, если вы добавите больше заявлений.

4 голосов
/ 21 декабря 2009

Фигурные скобки ограничивают область действия локальной переменной $ somevar:

{ мой $ somevar; ... } # $ Область действия Somevar заканчивается здесь

1 голос
/ 21 декабря 2009

Я не знаю много о Perl, но обычно вы создаете область видимости, используя фигурные скобки. Возможно, $ somevar не будет доступен во всем мире?

...