我使用数据::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 = {};使用描述的这里方法首先检查模块是否已加载,如果加载了Dumper方法,则只使用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的正确方法是什么?
谢谢。
发布于 2017-10-24 13:38:37
好的,首先不测试返回代码是很好的,但实际上,您可能更好地使用$@来检查eval是否有效。
例如:
eval {
require Data::Dumper;
Data::Dumper -> import();
};
if ( $@ ) {
print "loading failed, error was: $@\n";
} 但问题的根源是:
唯一导出的是Dumper()函数。 其实那不是真的。什么都不出口。然而,源文件过滤器被用来自动重写对C的任何明显调用,这样它就能做正确的事情。
因为当您通过请求/导入加载Data::Dumper::Simple时不会发生这种情况,因此Dumper函数的重载不会发生。
看着它-我看不出有一种简单的方法叫它“备用傻瓜”
https://stackoverflow.com/questions/46911597
复制相似问题