Co oznacza "1;" w Perlu?
Natknąłem się na kilka modułów Perla, które na przykład wyglądają podobnie do następującego kodu:
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;
Jakie jest znaczenie 1;
i kręconych szelek, które obejmują $somevar
i Sub?
7 answers
1
na końcu modułu oznacza, że moduł zwraca true
do use/require
Instrukcji. Może być użyty do stwierdzenia, czy inicjalizacja modułu powiodła się. W przeciwnym razie use/require
zawiedzie.
$somevar
jest zmienną dostępną tylko wewnątrz bloku. Służy do symulacji zmiennych "statycznych". Począwszy od Perla 5.10 możesz użyć słowa kluczowego state
słowo kluczowe, aby mieć takie same wyniki:
## Starting from Perl 5.10 you can specify "static" variables directly.
sub Somesub {
state $somevar;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 19:53:50
Kiedy ładujesz moduł " Foo " z use Foo
LUB require()
, perl wykonuje plik Foo.pm
jak zwykły skrypt. Oczekuje, że zwróci wartość true, jeśli moduł został poprawnie załadowany. 1;
tak robi. Może to być 2;
lub "hey there";
równie dobrze.
Blok wokół deklaracji $somevar
i funkcji Somesub
ogranicza zakres zmiennej. W ten sposób jest on dostępny tylko z Somesub
i nie jest usuwany przy każdym wywołaniu Somesub
(co miałoby miejsce, gdyby zostało zadeklarowane wewnątrz ciała funkcji). Ten idiom został zastąpiony w ostatnich wersjach Perla (5.10 i nowszych), które mają słowo kluczowe state.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 13:57:33
Moduły muszą zwracać wartość true. 1
jest wartością rzeczywistą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 13:54:14
Moduły Perla muszą zwracać coś, co ewaluuje na true. Jeśli nie, Perl zgłasza błąd.
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>
Chociaż zwyczajowo używa się "1;", wszystko, co ewaluuje do true, będzie działać.
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)
Z oczywistych powodów inną popularną wartością zwracaną jest 42.
Istnieje lista cool return values utrzymywana na http://returnvalues.useperl.at/values.html .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 19:57:02
Nawiasy klamrowe ograniczają zakres zmiennej lokalnej $somevar:
{ my $somevar; ... } # $somevar ' s scope ends here
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 13:53:52
Z dokumentacji dla require :
Plik musi zwracać true jako ostatni oświadczenie wskazujące na powodzenie wykonanie dowolnego kodu inicjującego, więc zwyczajowo kończy się taki plik z 1; chyba że jesteś pewien, że będzie w przeciwnym razie zwróć true. Ale jest lepiej wystarczy umieścić 1;, w przypadku, gdy dodasz więcej oświadczeń.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 14:07:10
Nie wiem zbyt wiele o perlu, ale zazwyczaj tworzysz Zakres za pomocą nawiasów klamrowych. Prawdopodobnie $somevar nie będzie dostępny na całym świecie?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 13:54:52