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

SSi*_*ilk 2 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);
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

$testHash = {};
Run Code Online (Sandbox Code Playgroud)

使用此处描述的方法首先检查模块是否已加载,如果它们只使用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);
}
Run Code Online (Sandbox Code Playgroud)

我的输出现在是:

Name "Data::Dumper::Sortkeys" used only once: possible typo at temp.pl line 51.
$VAR1 = {};
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

mob*_*mob 5

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

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

my $dumperLoaded;
BEGIN { 
    $dumperLoaded = eval "use Data::Dumper::Simple;1" ||
                    eval "use Data::Dumper;1";
}
Run Code Online (Sandbox Code Playgroud)