你为什么要放一个1; 在Perl 5模块的最后?

raz*_*aza 18 perl module

为什么所有Perl 5模块都必须以1;?结尾?

cod*_*ict 24

Perl模块必须以true值结束,否则认为它没有加载.按照惯例,这个值通常为1,尽管它可以是任何真值.模块可以以false结尾以指示失败,但这很少使用,而是die()(退出时出错).

来源:维基

  • 我已经看到''假';`之前用作真正的价值...... :) (6认同)

mfo*_*ani 7

那是因为use Module 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

看到了do $realfilename吗?看看perldoc -f do,你会发现它几乎就是等价的eval system("cat $realfilename"),这基本上意味着将文件放入其中,然后评估它.

查看perldoc -f eval产生:"在两种形式中,返回的值是在迷你程序中评估的最后一个表达式的值 ".也就是说,文件中的最后一个语句.

值得一提的是,如果最后一个"语句"是子例程声明,那么它不构成真正的值:

$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false
Run Code Online (Sandbox Code Playgroud)

而它1;之后:

$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true
Run Code Online (Sandbox Code Playgroud)

在再次寻找sub require以上,并与什么样的知识requiredo确实的$result是,do $realfilename回报确实是最后一条语句eval从文件,这确实是文件中的最后一条语句编辑.

如果这样的最后一个语句不是真值,## AND HERE elsif()则会突出显示我突出显示的内容,并且require当模块没有返回真值时它会死掉.该use Module也必死无疑,因为它是做require幕后.

简而言之,只要它是一个被trueperl 理解为的值,那么你对文件的结尾并不重要.上野(CPAN)样品包括1;,但也有一些这些天,而结束自己的文件1(没有缺少分号),和其他人只是古怪使用的东西一样'0 but true';或者'supercalifragilisticexpiralidous';,所有这些分析为被Perl"truish"的价值观.

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

快乐的黑客!