【问题标题】:Conditional load of Data::Dumper::Simple not workingData::Dumper::Simple 的条件加载不起作用
【发布时间】:2017-10-24 13:16:18
【问题描述】:

我正在使用 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 的正确方法是什么?

谢谢。

【问题讨论】:

  • 我在通过 require 加载 Data::Dumper::Simple 时遇到问题(在 Windows 上)。所以似乎有些不同。你也不需要测试Data::Dumper,因为它是一个核心模块。

标签: perl perl-module data-dumper


【解决方案1】:

Data::Dumper::Simple 是一个source filter。源过滤器必须在 Perl 的编译阶段加载,否则它们将无法处理脚本中的任何源代码。

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

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

【讨论】:

  • 嗯,关于 BEGIN 处理的好想法。我根本看不到让运行时导入“工作”的方法。
  • 这很好用,谢谢!就我而言,我将评估中的|| 更改为&&,因此必须加载两个模块才能进行数据转储。这有意义吗?否则这很好,当两个模块都加载成功时,关于Data::Dumper::Sortkeys 只使用一次的警告就会消失。
【解决方案2】:

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

例如:

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

但是你的问题的根源是这样的:

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

嗯,实际上这不是真的。什么都没有导出。然而,一个来源 过滤器用于自动重写对 C 的任何明显调用,因此 它只是做正确的事。

因为当您通过 require/import 加载 Data::Dumper::Simple 时,不会发生这种情况,因此不会发生 Dumper 函数的重载。

看着它——我实际上看不到一种简单的方法来调用“备用翻斗机”

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多