【问题标题】:Nested Perl Hash嵌套 Perl 哈希
【发布时间】:2014-04-25 06:10:39
【问题描述】:

我正在尝试从哈希中获取值并将其用作下一级哈希的键,此代码有效,但我认为必须有更好的方法来做到这一点。

有没有办法避免 K* 数组变量?

my @key = keys %data3;
my $deviceType = $key[0];
my @K = keys %{$data3 {$deviceType} };  ## Uber Ugly, find a better way.
my $measInfoID = $K[0]; 
my @K1 = keys %{$data3 {$deviceType} {$measInfoID}};
my $deviceID = $K1[0];
my @K2 = keys %{$data3 {$deviceType} {$measInfoID} {$deviceID}};
my $location = $K2[0];
my @K3 = %{$data3 {$deviceType} {$measInfoID} {$deviceID} {$location}};
my $measObjectLdn = $K3[0];

print ("Data: $deviceType, $measInfoID, $deviceID, $location, $measObjectLdn\n");
    foreach my $m ( keys %{ $data3 {$deviceType} {$measInfoID} {$deviceID} {$location} {$measObjectLdn} } ){
  print("OK: $m\n");
}

%data3 看起来像这样:

$VAR1 = 'NTHLRFE';
$VAR2 = {
    'DIA' => {
        'NJBB-HLR-2' => {
            'NJBB' => {
                'LTE-1/DIA-1' => {
                    'DiaUnknownAVPs' => '0',
                    'DiaCerRejSysInOvl' => '0',
                    'DiaProtocolErrors' => '0',
                    'DiaWrongProtType' => '0',
                    'DiaMessageRcvd' => '0',
                    'DiaOctetSent' => '0',
                    'DiaCerRejPrNtInWhtLst' => '0',
                    'DiaOctetRcvd' => '0',
                    'DiaMessageDscrd' => '0',
                    'DiaCerRejConAvailable' => '0',
                    'DiaMessageSent' => '0',
                    'DiaCerRejMaxConExcd' => '0'
                }
            }
        }
    }
};

谢谢!

【问题讨论】:

  • 请描述您要做什么$K[0]$K1[0]$K2[0]$K3[0] 的值是彩票,因为哈希是未排序的。如果所有嵌套散列只有一个元素,那么您选择了错误的方式来表示您的数据
  • 你为什么把你的哈希称为%data3?它根本没有告诉我它的目的
  • 这似乎是数据结构选择错误的情况。如果散列中只有 1 个键,那为什么还需要嵌套散列呢?为什么 deviceType、measInfoID、deviceID 和 location 不只是单个 hashref 中的键?

标签: perl hash casting nested


【解决方案1】:

键没有排序,所以“第一个键”并不总是相同的。

也就是说,如果你想稍微压缩一下,以下应该可以工作:

my $deviceType = (keys %data3)[0];
....
my $measInfoID = (keys $data3{$deviceType})[0];
....
my $deviceID = (keys $data3{$deviceType}{$measInfoID})[0];

这很丑陋,我不想成为你读完这篇文章的那个人。

键将适用于哈希引用以及从 Perl 5.14 开始的哈希。如果你比这更老,你只需要取消引用到一个完整的哈希值。

【讨论】:

  • 你回答了我的问题。谢谢。同意,这很难看。我是继承了这段代码的人。
  • 谢谢——为了以后的参考,你可以在 ()s 中包含一些东西来创建所谓的“列表上下文”,它就像一个数组。这就是允许您使用数组索引访问而不将其存储在变量中的原因——更快。您也可以用 [] 包围来创建一个 arrayref,但我不确定在这种情况下它是否重要。
猜你喜欢
  • 2018-12-17
  • 2020-12-09
  • 2016-09-05
  • 2012-11-27
  • 2021-11-28
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多