Что означает 1; значит на перле?

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


person Anand Shah    schedule 21.12.2009    source источник
comment
Я разочарован тем, что tchrist не ответил на это.   -  person Karl Knechtel    schedule 09.06.2011
comment
Технически это два вопроса в одном. Обычно я пытаюсь пресечь их в зародыше и отредактировать один вопрос до того, как придут ответы, но сейчас уже слишком поздно.   -  person Flimm    schedule 11.03.2015


Ответы (7)


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;
}
person Ivan Nevostruev    schedule 21.12.2009
comment
Проголосуйте, потому что этот ответ краткий и правильный, и фактически отвечает на все вопросы родителей. - person daxim; 21.12.2009

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

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

person tsee    schedule 21.12.2009

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

person Quentin    schedule 21.12.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.

person Ed Guiness    schedule 21.12.2009

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

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

person Pim    schedule 21.12.2009

Из документации для require:

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

person toolic    schedule 21.12.2009

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

person eWolf    schedule 21.12.2009