【问题标题】:Perl load module BEGINPerl 加载模块 BEGIN
【发布时间】:2020-11-25 21:44:48
【问题描述】:

我有这个代码

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


    【解决方案1】:

    你应该永远

    use strict;
    use warnings;
    

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

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

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

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

    【讨论】:

    • 值得注意的是,将括号添加到Dumper($var) 将允许 Perl 将其识别为函数调用,从而无需 BEGIN 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多