不区分大小写的哈希键perl

123*_*123 1 linux perl

问题

我有一个哈希/数组结构,但是有些哈希键不是在相同的情况下.

我想知道是否有办法处理这种情况,而无需手动检查每个哈希的键.

在下面的示例中,我希望打印所有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

这些数据从其他地方收到并且必须保持相同的情况,上面的例子是最小的,我不能简单地将它们全部更改为相同的情况.

需要更多信息让我知道.

Sob*_*que 5

嗯,这取决于你的信息来源.这看起来像你已经解析了一些东西,所以可能有更好的解决方案.

但是,通过我们在这里得到的,我会这样做:

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)

这是通过使用grepi对正则表达式的情况下不区分大小写的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"修复"为具有小写属性,这可能不是您想要的.但是,它可能对其他场景有用,这就是为什么我给出了两个例子.