首页 > 解决方案 > Perl 加载模块 BEGIN

问题描述

我有这个代码

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

输出是

Starting
Module=1
$VAR1 = 1;

和这个

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

和输出

Starting
Module=1

为什么在第一种情况下打印变量

标签: perl

解决方案


你应该永远

use strict;
use warnings;

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

print() on unopened filehandle Dumper at file.pl line 10. 

在第一个示例中,您将 eval 包装在 BEGIN 块中。所以Dumper当它的使用行被编译时已经被导入。

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


推荐阅读