gpt4 book ai didi

perl - 获取Perl以将 “key path”完整打印为值(Data::Dumper不会)

转载 作者:行者123 更新时间:2023-12-02 07:44:59 25 4
gpt4 key购买 nike

$foo{alongkeyname}{anotherlongkeyname}{yetanotherlongkeyname}{afairlyshortkeynamewellitgotlongwhileiwastypingitsoiguessnot}{bob}{something} = 1; 

我如何让Perl打印$ foo并显示完整的“路径名”
达到1?换句话说,我想要的输出看起来类似于
在上方输入。

Data::Dumper不会执行此操作,并且长键名会包装输出,
使缩进形式的用处不大。

很久以前,我在 https://github.com/barrycarter/bcapps/blob/master/bclib.pl#L109上编写了自己的“展开”子例程,该例程输出:
<hash HASH(0x92a33a4)> 
<key>
alongkeyname
</key>
<val>
<hash HASH(0x95103b4)>
<key>
anotherlongkeyname
</key>
<val>
<hash HASH(0x9510464)>
<key>
yetanotherlongkeyname
</key>
<val>
<hash HASH(0x9510434)>
<key>
afairlyshortkeynamewellitgotlongwhileiwastypingitsoiguessnot
</key>
<val>
<hash HASH(0x95bae7c)>
<key>
bob
</key>
<val>
<hash HASH(0x95cf8bc)>
something: 1
</hash HASH(0x95cf8bc)>

</val>
</hash HASH(0x95bae7c)>

</val>
</hash HASH(0x9510434)>

</val>
</hash HASH(0x9510464)>

</val>
</hash HASH(0x95103b4)>

</val>
</hash HASH(0x92a33a4)>

但这也不是很有用。

现实生活中的项目激发了这个问题:从中提取SYNOP / BUOY数据
XML::metaf2xml的简单哈希化输出

编辑:谢谢本!我尝试了一下,在我的例子中效果很好。然后我在另一个哈希上尝试了它,并得到:
$VAR1 = {'remark' => [{'obsStationType' => {'stationType' => {'v' => 'AO2'},'s' => 'AO2'}},{'needMaint' => {'s' => '$'}}],'QNH' => {'inHg' => {'v' => '29.99'},'s' => 'A2999'},'visPrev' => {'distance' => {'u' => 'SM','v' => '7','rp' => '1'},'s' => '7SM'},'sfcWind' => {'wind' => {'speed' => {'u' => 'KT','v' => '3'},'dir' => {'rn' => '5','v' => '60','rp' => '4'}},'measurePeriod' => {'u' => 'MIN','v' => '2'},'s' => '06003KT'},'obsStationId' => {'id' => {'v' => 'KBTR'},'s' => 'KBTR'},'obsTime' => {'s' => '080940Z','timeAt' => {'hour' => {'v' => '09'},'minute' => {'v' => '40'},'day' => {'v' => '08'}}},'s' => 'KBTR 080940Z 06003KT 7SM SCT003 BKN200 24/23 A2999 RMK AO2 $','cloud' => [{'cloudCover' => {'v' => 'SCT'},'s' => 'SCT003','cloudBase' => {'u' => 'FT','v' => '300'}},{'cloudCover' => {'v' => 'BKN'},'s' => 'BKN200','cloudBase' => {'u' => 'FT','v' => '20000'}}],'temperature' => {'relHumid4' => {'v' => '94.15'},'dewpoint' => {'temp' => {'u' => 'C','v' => '23'}},'relHumid3' => {'v' => '94.03'},'relHumid1' => {'v' => '94.16'},'relHumid2' => {'v' => '94.17'},'air' => {'temp' => {'u' => 'C','v' => '24'}},'s' => '24/23'}};

因此,我认为我想回答的问题是:此哈希值将为您带来上面显示的“94.15”值吗?从上面很难说出来。

(如果有人好奇,答案是$ hash {temperature} {relHumid4} {v})

更多编辑:谢谢,伊尔马里。我在上面尝试了我的VAR1的dump_var($ VAR1)并得到...

HASH(0x9ae6764) = undef;

我还尝试了dump_var({$ VAR1}),结果相同。我可能已经错过了一些东西。您可以在上面剪切并粘贴我的VAR1,看看它是否有效吗?正如您在“使用”声明中所指出的,我确实导出了“自卸车”。

最佳答案

这是一个快速的自己动手的解决方案:

use Data::Dumper 'Dumper';

sub dump_var {
my ($prefix, $var) = @_;
my @rv;
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Terse = 1;
if (ref $var eq 'ARRAY' and @$var) {
for my $i (0 .. $#$var) {
push @rv, dump_var($prefix . "->[$i]", $var->[$i]);
}
} elsif (ref $var eq 'HASH' and %$var) {
foreach my $key (sort keys %$var) {
push @rv, dump_var($prefix . '->{'.Dumper($key).'}', $var->{$key});
}
} elsif (ref $var eq 'SCALAR') {
push @rv, dump_var('${' . $prefix . '}', $$var);
} else {
push @rv, "$prefix = " . Dumper($var) . ";\n";
}
return @rv;
}

和一些测试代码:

my $foo = {
alpha => [ 'beta', \ 'gamma' ],
one => { two => { three => 3, four => 3.141 },
five => { six => undef, seven => \*STDIN },
},
foobar => sub { print "Hello, world!\n"; },
};

print dump_var('$foo' => $foo);

产生输出:

$foo->{'alpha'}->[0] = 'beta';
${$foo->{'alpha'}->[1]} = 'gamma';
$foo->{'foobar'} = sub { "DUMMY" };
$foo->{'one'}->{'five'}->{'seven'} = \*::STDIN;
$foo->{'one'}->{'five'}->{'six'} = undef;
$foo->{'one'}->{'two'}->{'four'} = '3.141';
$foo->{'one'}->{'two'}->{'three'} = 3;

编辑:在测试 a PHP version of this code时,我意识到它不能正确处理空数组和哈希。我已经修复了代码,以便将这些值直接传递给 Dumper

关于perl - 获取Perl以将 “key path”完整打印为值(Data::Dumper不会),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716409/

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