gpt4 book ai didi

linux - 不区分大小写的哈希键 perl

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:53 24 4
gpt4 key购买 nike

问题

我有一个散列/数组结构,但有些散列键的大小写不一样。

我想知道是否有一种方法可以在不手动检查每个散列的键的情况下处理这种情况。

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

其他

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";
}

这通过使用 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>

或者你可以:

foreach my $server ( $twig -> get_xpath('//Server') ) {
$server -> lc_attnames;
print $server -> att('id'),"\n";
}

代替在 Twig 处理程序中执行此操作。第一个答案会将您的所有 XML“修复”为具有小写属性,这可能不是您想要的。但是,它可能对其他场景有用,这就是我给出两个示例的原因。

关于linux - 不区分大小写的哈希键 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40864369/

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