Frage Warum musst du eine 1 setzen? am Ende eines Perl 5-Moduls?


Warum müssen alle Module von Perl 5 enden? 1;?


15
2017-08-31 06:29


Ursprung


Antworten:


Ein Perl-Modul muss mit einem wahren Wert enden, andernfalls wird es nicht berücksichtigt    habe geladen. Per Konvention ist dieser Wert normalerweise 1, obwohl es sein kann    jeder wahre Wert. Ein Modul kann mit false enden, um einen Fehler anzuzeigen, aber    Dies wird selten verwendet und es würde stattdessen sterben () (mit einem Fehler beenden).

Quelle: Wiki


23
2017-08-31 06:32



Das ist, weil use Module LIST; ist äquivalent zu BEGIN { require Module; Module->import( LIST ); } (sehen perldoc -f verwenden)

Insbesondere, require Module; kann mit folgendem Code (von perldoc -f benötigt):

sub require {
  my ($filename) = @_;
  if (exists $INC{$filename}) {
    return 1 if $INC{$filename};
    die "Compilation failed in require";
  }
  my ($realfilename,$result);
  ITER: {
    foreach $prefix (@INC) {
      $realfilename = "$prefix/$filename";
      if (-f $realfilename) {
        $INC{$filename} = $realfilename;
        $result = do $realfilename; ## HERE
        last ITER;
      }
    }
    die "Can't find $filename in \@INC";
  }
  if ($@) {
    $INC{$filename} = undef;
    die $@;
  } elsif (!$result) { ## AND HERE
    delete $INC{$filename};
    die "$filename did not return true value";
  } else {
    return $result;
  }
}

Siehst du das do $realfilename? Ansehen perldoc -f tunund du wirst sehen, dass es ziemlich genau so ist eval system("cat $realfilename")das bedeutet im Grunde schlürfen die Datei in, und eval es.

Anschauen perldoc -f eval ergibt: "In beiden Formen ist der zurückgegebene Wert der Wert des letzten im Miniprogramm ausgewerteten Ausdrucks". Das ist die letzte Aussage in der Datei.

Es ist erwähnenswert, dass, wenn die letzte "Anweisung" eine Subroutinen-Deklaration ist, dies keinen wahren Wert darstellt:

$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false

Während a 1; nachdem es tut:

$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true

Schau wieder auf die sub require oben und mit dem Wissen von was require und do tut, das $result dass die do $realfilename Rückkehr ist in der Tat die letzte Aussage evalEd aus der Datei, die in der Tat die letzte Anweisung in der Datei ist.

Wenn diese letzte Aussage kein wahrer Wert ist, wird die ## AND HERE  elsif() Ich habe hervorgehoben, würde aufgerufen werden, und die require würde sterben, da das Modul keinen wahren Wert zurückgibt. Das use Module würde auch sterben, wie es ein tut require hinter den Kulissen.

Lange Rede, kurzer Sinn, es spielt keine Rolle, wofür du die Datei beendest, solange es ein Wert ist, der verstanden wird true per Perl. Samples on the wild (CPAN) enthalten 1;, obwohl einige heutzutage ihre Dateien eher beenden 1 (kein Semikolon fehlt), und andere benutzen einfach komisch Sachen wie '0 but true'; oder 'supercalifragilisticexpiralidous';, die alle als "truish" -Werte von Perl analysiert werden.

Hoffe das obige ist zu Ihrer Zufriedenheit;)

Fröhliches Hacken!


7
2017-08-31 12:26