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

时间:2010-08-31 06:29:40

标签: perl module

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

2 个答案:

答案 0 :(得分:23)

  

Perl模块必须以true值结束,否则认为不是    装了。按照惯例,这个值通常是1,尽管它可以    任何真正的价值。模块可以以false结尾以指示失败但是    这很少使用,它会改为die()(退出时出错)。

来源:wiki

答案 1 :(得分:7)

那是因为use Module LIST;相当于BEGIN { require Module; Module->import( LIST ); }(见perldoc -f use

特别是,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';或{{1}这样的东西所有这些都被Perl解析为“truish”值。

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

快乐的黑客攻击!