Perl 加载模块 BEGIN

Liv*_*scu 2 perl

我有这个代码

print "Starting\n";
BEGIN {
        $module='Data::Dumper';
        $module_available=1;
        eval "use $module; 1" or $module_available = 0;
        }
$var=1;
print "Module=$module_available\n";
print Dumper $var if ($module_available==1);
Run Code Online (Sandbox Code Playgroud)

输出是

Starting
Module=1
$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)

和这个

print "Starting\n";
        $module='Data::Dumper';
        $module_available=1;
        eval "use $module; 1" or $module_available = 0;
$var=1;
print "Module=$module_available\n";
print Dumper $var if ($module_available==1);
Run Code Online (Sandbox Code Playgroud)

和输出

Starting
Module=1
Run Code Online (Sandbox Code Playgroud)

为什么在第一个场景中打印变量

cla*_*amp 6

你应该总是

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

在您的第二个示例中,当您的代码被编译时,Dumper不称为函数。所以 perl 把它当作一个裸字文件句柄。如果你使用警告,你会得到

print() on unopened filehandle Dumper at file.pl line 10. 
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您将 eval 包装在 BEGIN 块中。SoDumper在其用法行被编译时已经导入。

您可以在此处阅读有关 BEGIN 块的更多信息:perlmod

  • 值得注意的是,在“Dumper($var)”中添加括号将允许 Perl 将其识别为函数调用,从而消除对“BEGIN”块的需要。 (2认同)