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?

Author: Peter Mortensen, 2009-12-21

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;
}
 65
Author: Ivan Nevostruev,
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.

 11
Author: tsee,
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ą.

 8
Author: Quentin,
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 .

 8
Author: Ed Guiness,
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

 4
Author: Pim,
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ń.

 4
Author: toolic,
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?

 1
Author: eWolf,
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