Perl 加载模块开始

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

输出是

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

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

最佳答案

你应该永远

use strict;
use warnings;

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

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

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

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

关于Perl 加载模块开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65002289/

相关文章:

regex - Perl 正则表达式 dotall 问题

在 AIX 5.3 版上编译 perl >5.10

windows - 视频卡在 Perl 脚本中的 system(1, @commands) 上

Perl 缺少请求跟踪器安装的依赖项

perl - 如何在 Perl 中重新分配非核心模块?

javascript - 使用 Tor 网络执行 JavaScript,无需人工交互

perl 从日期中减去一个月

perl - -CSD 为时已晚

perl - 我可以在堆栈中上下移动调试器上下文吗?

bash - 将 SSH 流作为 Perl 脚本输入而不是物理文件