首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据的条件加载::Dumper::简单不工作

数据的条件加载::Dumper::简单不工作
EN

Stack Overflow用户
提问于 2017-10-24 13:16:18
回答 1查看 483关注 0票数 2

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

在不检查模块是否成功加载的情况下,我将如何加载和使用它们的MWE是:

代码语言:javascript
复制
use strict;
use warnings;

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

my %testHash=();

warn Dumper(\%testHash);

其中的指纹:

代码语言:javascript
复制
$testHash = {};

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

代码语言:javascript
复制
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);
}

我现在的产出是:

代码语言:javascript
复制
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的正确方法是什么?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-10-24 13:38:37

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

例如:

代码语言:javascript
复制
eval { 
   require Data::Dumper;
   Data::Dumper -> import();
};
if ( $@ ) { 
   print "loading failed, error was: $@\n";
} 

但问题的根源是:

唯一导出的是Dumper()函数。 其实那不是真的。什么都不出口。然而,源文件过滤器被用来自动重写对C的任何明显调用,这样它就能做正确的事情。

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

看着它-我看不出有一种简单的方法叫它“备用傻瓜”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46911597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档