条件加载Data :: Dumper ::简单无法正常工作

时间:2017-10-24 13:16:18

标签: perl perl-module data-dumper

我使用Data :: Dumper和Data :: Dumper :: Simple(DD和DDS)以详细的脚本模式打印哈希,我希望能够与其他人共享它没有安装这些模块,所以我检查他们是否已经加载。

如果没有检查模块是否成功加载,我将如何加载和使用它们的MWE:

use strict;
use warnings;

use Data::Dumper;
use Data::Dumper::Simple;
$Data::Dumper::Sortkeys = 1;

my %testHash=();

warn Dumper(\%testHash);

打印哪些:

$testHash = {};

使用描述here的方法首先检查模块是否已加载,如果它们只使用Dumper方法,我将代码重写为:

use strict;
use warnings;


my $dumperLoaded = 1;
my $rc;

$rc = eval
{
    require Data::Dumper;
    Data::Dumper->import();
    1;
};
if(!$rc)
{
    print "Data::Dumper not found\n";
    $dumperLoaded = 0;
}

$rc = eval
{
    require Data::Dumper::Simple;
    Data::Dumper::Simple->import();
    1;
};
if(!$rc)
{
    print "Data::Dumper::Simple not found\n";
    $dumperLoaded = 0;
}
if($dumperLoaded){
    $Data::Dumper::Sortkeys = 1;
}

my %testHash=();

if($dumperLoaded){
    warn Dumper(\%testHash);
}

我的输出现在是:

Name "Data::Dumper::Sortkeys" used only once: possible typo at temp.pl line 51.
$VAR1 = {};

现在,哈希转储没有显示变量名testHash,就好像DDS没有加载一样。但是,我的脚本没有抱怨它无法加载DDS。我可以通过评论use Data::Dumper::Simple;在我的第一个MWE中复制这个。

我的问题:为什么我的脚本的第二个版本,检查模块加载,只打印DD,而不是DDS加载?

奖金问题:在这样的条件模块加载场景中设置SortKeys的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:5)

Data::Dumper::Simplesource filter。必须在Perl的编译阶段加载源过滤器,否则它们不会对脚本中的任何源代码执行任务。

可能有效(未经测试)有效:

my $dumperLoaded;
BEGIN { 
    $dumperLoaded = eval "use Data::Dumper::Simple;1" ||
                    eval "use Data::Dumper;1";
}

答案 1 :(得分:1)

好的,首先关闭 - 测试返回代码很不错,但实际上您可能更好地使用$@来检查eval是否有效。

E.g:

eval { 
   require Data::Dumper;
   Data::Dumper -> import();
};
if ( $@ ) { 
   print "loading failed, error was: $@\n";
} 

但问题的根源是:

  

唯一导出的是Dumper()函数。

     

嗯,实际上并非如此。什么都没有出口。但是,一个来源   filter用于自动重写对C的任何明显调用   它只做正确的事。

因为当您通过require / import重新加载Data::Dumper::Simple时, 功能没有发生。

看着它 - 我实际上看不到一种简单的方法来调用“替代翻车机”。