【发布时间】: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 中的键?