gpt4 book ai didi

perl - Data::Dumper::Simple 的条件加载不工作

转载 作者:行者123 更新时间:2023-12-02 08:11:10 24 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

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

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

关于perl - Data::Dumper::Simple 的条件加载不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46911597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com