我有一个哈希/数组结构,但是有些哈希键不是在相同的情况下.
我想知道是否有办法处理这种情况,而无需手动检查每个哈希的键.
在下面的示例中,我希望打印所有ID/iD/id/Id字段.
use warnings;
use strict;
my $Hash = {
Server => [
{
Id=>123
},
{
iD=>456
},
{
ID=>789
}
]
};
for (@{$Hash->{Server}}){
print "$_->{ID}\n"
#This is the problematic part
}
Run Code Online (Sandbox Code Playgroud)
perl版本:v5.10.0
这些数据从其他地方收到并且必须保持相同的情况,上面的例子是最小的,我不能简单地将它们全部更改为相同的情况.
需要更多信息让我知道.
嗯,这取决于你的信息来源.这看起来像你已经解析了一些东西,所以可能有更好的解决方案.
但是,通过我们在这里得到的,我会这样做:
for my $entry (@{$Hash->{Server}}){
#grep, find first match. Dupes discarded.
my ( $key ) = grep { /^id$/i } keys %$entry;
print "$key => ",$entry -> {$key},"\n";
}
Run Code Online (Sandbox Code Playgroud)
这是通过使用grep与i对正则表达式的情况下不区分大小写的keys,并且抓住一切先出来.因此,如果你有多个匹配,/id/i那么它将是随机的你得到的.(sort虽然可以帮助)
鉴于你正在使用XML,我可能会回溯一下,抛出XML::Simple并做这样做:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> new ( twig_handlers => { '_all_' => sub { $_ -> lc_attnames }} );
$twig -> parse ( \*DATA );
print "XML looks like:\n";
$twig -> set_pretty_print ( 'indented_a');
$twig -> print;
print "Output:\n";
foreach my $server ( $twig -> get_xpath('//Server') ) {
print $server -> att('id'),"\n";
}
__DATA__
<XML>
<Server ID="123" />
<Server Id="456" />
<Server id="789" />
</XML>
Run Code Online (Sandbox Code Playgroud)
或者您可以:
foreach my $server ( $twig -> get_xpath('//Server') ) {
$server -> lc_attnames;
print $server -> att('id'),"\n";
}
Run Code Online (Sandbox Code Playgroud)
而不是在枝条处理程序中这样做.第一个答案是将所有XML"修复"为具有小写属性,这可能不是您想要的.但是,它可能对其他场景有用,这就是为什么我给出了两个例子.