perl - 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
为什么在第一种情况下打印变量
解决方案
你应该永远
use strict;
use warnings;
在您的第二个示例中,当您的代码被编译时,Dumper
它不被称为函数。所以 perl 把它当作一个裸字文件句柄。如果你使用警告,你会得到
print() on unopened filehandle Dumper at file.pl line 10.
在第一个示例中,您将 eval 包装在 BEGIN 块中。所以Dumper
当它的使用行被编译时已经被导入。
您可以在此处阅读有关 BEGIN 块的更多信息:perlmod
推荐阅读
- html - CSS职位背后的逻辑是什么?
- html - php / laravel 在网页中将 Excel 显示为真实表格
- excel - 如何将 Power BI 报表生成器设置为 Excel 数据连接并从表中检索数据
- python - /admin 处的 Django FileNotFoundError
- mysql - 使用带有视图的汇总会给我一个空字段?
- c++ - 来自外部类的模拟静态方法(我无法更改!)
- c# - Xamarin.UITest 如何在测试之间更改应用程序的状态?
- python - 更改父框布局kivy的大小
- reactjs - 如何使用 Express 和 React 处理 Passport 身份验证中的网络错误
- delphi - Delphi:布尔值的初始化在 32 位和 64 位应用程序中不同