我使用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的正确方法是什么?
感谢。
答案 0 :(得分:5)
Data::Dumper::Simple
是source 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
时, 功能没有发生。
看着它 - 我实际上看不到一种简单的方法来调用“替代翻车机”。