我有这个代码
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/