Что делает “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?

33
задан Peter Mortensen 16 March 2014 в 19:58
поделиться

7 ответов

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;
}
67
ответ дан 27 November 2019 в 17:33
поделиться

Когда вы загружаете модуль «Foo» с использует Foo или require () , perl выполняет файл Foo.pm как обычный скрипт. Ожидается, что он вернет истинное значение, если модуль был загружен правильно. Это делает 1; . Это может быть 2; или «привет»; с тем же успехом.

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

11
ответ дан 27 November 2019 в 17:33
поделиться

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

На http://returnvalues.useperl.at/values.html .

есть список полезных возвращаемых значений.
8
ответ дан 27 November 2019 в 17:33
поделиться

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

8
ответ дан 27 November 2019 в 17:33
поделиться

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

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

4
ответ дан 27 November 2019 в 17:33
поделиться

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

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

4
ответ дан 27 November 2019 в 17:33
поделиться

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

1
ответ дан 27 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: