簡體   English   中英

你為什么要放一個1; 在Perl 5模塊的最后?

[英]Why do you have to put a 1; at the end of a Perl 5 module?

為什么所有Perl 5模塊都必須以1;結尾1;

Perl模塊必須以true值結束,否則認為它沒有加載。 按照慣例,這個值通常為1,盡管它可以是任何真值。 模塊可以以false結尾以指示失敗,但這很少使用,而是die()(退出時出錯)。

來源: 維基

那是因為use Module LIST; 相當於BEGIN { require Module; Module->import( LIST ); } BEGIN { require Module; Module->import( LIST ); } BEGIN { require Module; Module->import( LIST ); } (參見perldoc -f使用

特別是require Module; 可以使用以下代碼實現(來自perldoc -f require ):

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;
  }
}

看到do $realfilename嗎? 看看perldoc -f do ,你會發現它幾乎與eval system("cat $realfilename") ,這基本上意味着將文件放入其中並對其進行評估。

查看perldoc -f eval產生:“在兩種形式中,返回的值是在迷你程序中評估的最后一個表達式的值 ”。 也就是說,文件中的最后一個語句。

值得一提的是,如果最后一個“語句”是子例程聲明,那么它不構成真正的值:

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

1; 之后:

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

在再次尋找sub require之上,並與什么樣的知識requiredo那樣,在$result是, do $realfilename回報確實是最后一條語句eval從文件,這確實是文件中的最后一條語句編輯。

如果這樣的最后一個語句不是真值,那么我將調用我突出顯示的## AND HERE elsif() ,並且由於模塊沒有返回真值,所以require將會死亡。 use Module也會死,因為它在幕后做了一個require

簡而言之,只要它是一個被perl理解為true值,那么你對文件的結束並不重要。 野外樣本(CPAN)包括1; 雖然有些人現在寧願結束他們的文件1 (沒有丟失的分號),而其他人只是奇怪地使用像'0 but true';這樣'0 but true';東西'0 but true'; 'supercalifragilisticexpiralidous'; ,所有這些都被Perl解析為“truish”值。

希望以上是令您滿意的;)

快樂的黑客!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM