Намерих няколко 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?
Отговори:
65 за отговор № 11
в края на модула означава, че модулът се връща 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 за отговор № 2
Когато заредите модул "Foo" с use Foo
или require()
, perl изпълнява Foo.pm
файл като обикновен скрипт. Той очаква да върне истинска стойност, ако модулът е бил зареден правилно. Най- 1;
прави това. Може да е 2;
или "hey there";
също толкова добре.
Блокът около декларацията $somevar
и функцията Somesub
ограничава обхвата на променливата. По този начин той е достъпен само от Somesub
и не се изчиства от всяко позоваване на Somesub
(което би се случило, ако то беше обявено във функционалния орган). Този идиом е заменен в последните версии на perl (5.10 и по-горе), които имат състояние ключова дума.
8 за отговор № 3
Модулите трябва да върнат истинска стойност. 1
е истинска стойност.
8 за отговор № 4
Perl модулите трябва да върнат нещо, което се оценява в истински. Ако не, Perl съобщава за грешка.
C:temp>cat MyTest.pm
package MyTest;
use strict;
sub test { print "testn"; }
#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", всичко, което оценява до истината, ще работи.
C:temp>cat MyTest.pm
package MyTest;
use strict;
sub test { print "testn"; }
"false";
C:temp>perl -e "use MyTest"
C:temp> (no error here)
За очевидни причини друга популярна връщаща стойност е 42.
Съществува списък с хладни връщащи стойности, поддържани на http://returnvalues.useperl.at/values.html.
4 за отговор № 5
Сгъваемите скоби ограничават обхвата на локалната променлива $ somevar:
{ моят $ somevar; ... } Обхватът на # # somevar завършва тук
4 за отговор № 6
От документацията за изисква:
Файлът трябва да се върне вярно като последното изявлениеда се посочи успешно изпълнение на кода за инициализация, така че е обичайно да прекратите такъв файл с 1; освен ако не сте сигурни в това връщане вярно иначе. Но това е по-добре само за да поставите 1; , ако добавите повече изявления.
1 за отговор № 7
Не знам много за Perl, но обикновено създавате обсег, използвайки къдрави скоби. Вероятно $ somevar не трябва да се предлага в световен мащаб?