Perl中的多维数组或哈希存取项目

问题描述

Newbuy的问题。

我有一个看起来像这样的json文件

{
    "Controllers":[
    {
            "Command Status" : {
                    "Controller" : 0,"Status" : "Success","Description" : "None"
            },"Response Data" : {
                    "Product Name" : "LSI MegaraID SAS 9260-8i","Serial Number" : "SV30408696","SAS Address" : " 500605b005c557f0","PCI Address" : "00:01:00:00","System Time" : "11/02/2020 01:15:01","Mfg. Date" : "01/23/13","Controller Time" : "11/02/2020 08:03:07","FW Package Build" : "12.15.0-0239","FW Version" : "2.130.403-4660","BIOS Version" : "3.30.02.2_4.16.08.00_0x06060A05","Driver Name" : "megaraid_sas","Driver Version" : "07.703.05.00-rc1","vendor Id" : 4096,"Device Id" : 121,"Subvendor Id" : 4096,"SubDevice Id" : 37473,"Host Interface" : "PCI-E","Device Interface" : "SAS-6G","Bus Number" : 1,"Device Number" : 0,"Function Number" : 0,"Drive Groups" : 6,"TOPOLOGY" : [
                            {
                                    "DG" : 0,"Arr" : "-","Row" : "-","EID:Slot" : "-","DID" : "-","Type" : "RAID1","State" : "Optl","BT" : "N","Size" : "465.25 GB","PDC" : "dflt","PI" : "N","SED" : "N","DS3" : "none","FSpace" : "N","TR" : "N"
                            },{
                                    "DG" : 0,"Arr" : 0,"Row" : 0,"EID:Slot" : "252:1","DID" : 8,"Type" : "DRIVE","State" : "Onln","FSpace" : "-","Row" : 1,"EID:Slot" : "252:0","DID" : 9,{
                                    "DG" : 1,"Type" : "RAID0","Size" : "3.637 TB","EID:Slot" : "252:2","DID" : 10,{
                                    "DG" : 2,"EID:Slot" : "252:3","DID" : 11,{
                                    "DG" : 3,"EID:Slot" : "252:4","DID" : 13,{
                                    "DG" : 4,"EID:Slot" : "252:5","DID" : 14,{
                                    "DG" : 5,"EID:Slot" : "252:6","DID" : 15,"TR" : "N"
                            }
                    ],"Virtual Drives" : 6,"VD LIST" : [
                            {
                                    "DG/VD" : "0/0","TYPE" : "RAID1","Access" : "RW","Consist" : "Yes","Cache" : "RWTD","Cac" : "-","sCC" : "ON","Name" : ""
                            },{
                                    "DG/VD" : "1/1","TYPE" : "RAID0",{
                                    "DG/VD" : "2/2",{
                                    "DG/VD" : "3/3",{
                                    "DG/VD" : "4/4",{
                                    "DG/VD" : "5/5","Name" : ""
                            }
                    ],"Physical Drives" : 7,"PD LIST" : [
                            {
                                    "EID:Slt" : "252:0","DG" : 0,"Intf" : "SATA","Med" : "HDD","SeSz" : "512B","Model" : "ST500DM002-1BD142","Sp" : "U","Type" : "-"
                            },{
                                    "EID:Slt" : "252:1",{
                                    "EID:Slt" : "252:2","DG" : 1,"Model" : "ST4000NM0033-9ZM170",{
                                    "EID:Slt" : "252:3","DG" : 2,{
                                    "EID:Slt" : "252:4","DG" : 3,{
                                    "EID:Slt" : "252:5","DG" : 4,{
                                    "EID:Slt" : "252:6","DG" : 5,"Type" : "-"
                            }
                    ]
            }
    }
    ]
    }

这是RAID控制器测试的日志。任务听起来像是:检查所有虚拟驱动器(其状态)以及每个虚拟驱动器中的每个磁盘以及磁盘的状态。

现在,我什至不了解如何访问顶级项目。尝试了很多选择,但完全不了解。 代码示例之一:

#!/usr/bin/perl
use strict;
use warnings;
use JSON::XS;
use File::Slurp;
use Data::Dumper;

my $json_source = "state.json";   

my $json = read_file( $json_source ) or die "Couldn't read the file";
my $json_array = decode_json $json or die "Couldn't recognize JSON";

foreach my $item( %$json_array{Controllers} ) { 
    print Dumper($item->{'Command status'});
}

对于理解或代码示例方面的帮助将非常感谢。如我所见,json的第二级键名中的空格可能是一个问题。此外,decode_json()完​​全返回什么-链接到什么?要哈希,要数组,要哈希数组?不可能这么复杂-我看到了使用相同json的python示例-它看起来非常简单(确实如此)。请帮助。

解决方法

输入数据表示复杂的结构。我们只需要提取感兴趣的信息。

这可以通过利用具有感兴趣字段的数组来实现。将数据放入数组后,我们必须遍历数组。

请调查以下符合您任务要求的代码。

track.setAttribute('default','');

输出

use strict;
use warnings;
use feature 'say';

use JSON;

my $data = do { local $/; <DATA> };
my $struct = from_json($data);

my @product  = ('Product Name','Serial Number','System Time','Controller Time','Mfg. Date','FW Package Build','FW Version','BIOS Version','Driver Name','Driver Version','Host Interface','Device Interface'
                );
my @status   = qw/Controller Status Description/;
my @v_fields = ('DG/VD','TYPE','State','Access','Size','Name');
my @p_fields = ('DG','DID','Med','Intf','Model');

for my $c ( @{ $struct->{Controllers} } ) {
    say '--- Status '  . '-' x 45;
    printf "%-12s %s\n",$_,$c->{'Command Status'}{$_} for @status;

    say '--- Product ' . '-' x 44;
    printf "%-18s %s\n",$c->{'Response Data'}{$_}  for @product;

    say '--- Virtual ' . '-' x 60;
    say join "\t",@v_fields;
    for my $vd ( @{ $c->{'Response Data'}{'VD LIST'} } ) {
        say join "\t",$vd->@{@v_fields};
    }

    say '--- Physical ' . '-' x 60;
    say join "\t",@p_fields;
    for my $pd ( @{ $c->{'Response Data'}{'PD LIST'} } ) {
        say join "\t",$pd->@{@p_fields};
    }
}
                           
__DATA__
{
    "Controllers":[
    {
            "Command Status" : {
                    "Controller" : 0,"Status" : "Success","Description" : "None"
            },"Response Data" : {
                    "Product Name" : "LSI MegaRAID SAS 9260-8i","Serial Number" : "SV30408696","SAS Address" : " 500605b005c557f0","PCI Address" : "00:01:00:00","System Time" : "11/02/2020 01:15:01","Mfg. Date" : "01/23/13","Controller Time" : "11/02/2020 08:03:07","FW Package Build" : "12.15.0-0239","FW Version" : "2.130.403-4660","BIOS Version" : "3.30.02.2_4.16.08.00_0x06060A05","Driver Name" : "megaraid_sas","Driver Version" : "07.703.05.00-rc1","Vendor Id" : 4096,"Device Id" : 121,"SubVendor Id" : 4096,"SubDevice Id" : 37473,"Host Interface" : "PCI-E","Device Interface" : "SAS-6G","Bus Number" : 1,"Device Number" : 0,"Function Number" : 0,"Drive Groups" : 6,"TOPOLOGY" : [
                            {
                                    "DG" : 0,"Arr" : "-","Row" : "-","EID:Slot" : "-","DID" : "-","Type" : "RAID1","State" : "Optl","BT" : "N","Size" : "465.25 GB","PDC" : "dflt","PI" : "N","SED" : "N","DS3" : "none","FSpace" : "N","TR" : "N"
                            },{
                                    "DG" : 0,"Arr" : 0,"Row" : 0,"EID:Slot" : "252:1","DID" : 8,"Type" : "DRIVE","State" : "Onln","FSpace" : "-","Row" : 1,"EID:Slot" : "252:0","DID" : 9,{
                                    "DG" : 1,"Type" : "RAID0","Size" : "3.637 TB","EID:Slot" : "252:2","DID" : 10,{
                                    "DG" : 2,"EID:Slot" : "252:3","DID" : 11,{
                                    "DG" : 3,"EID:Slot" : "252:4","DID" : 13,{
                                    "DG" : 4,"EID:Slot" : "252:5","DID" : 14,{
                                    "DG" : 5,"EID:Slot" : "252:6","DID" : 15,"TR" : "N"
                            }
                    ],"Virtual Drives" : 6,"VD LIST" : [
                            {
                                    "DG/VD" : "0/0","TYPE" : "RAID1","Access" : "RW","Consist" : "Yes","Cache" : "RWTD","Cac" : "-","sCC" : "ON","Name" : ""
                            },{
                                    "DG/VD" : "1/1","TYPE" : "RAID0",{
                                    "DG/VD" : "2/2",{
                                    "DG/VD" : "3/3",{
                                    "DG/VD" : "4/4",{
                                    "DG/VD" : "5/5","Name" : ""
                            }
                    ],"Physical Drives" : 7,"PD LIST" : [
                            {
                                    "EID:Slt" : "252:0","DG" : 0,"Intf" : "SATA","Med" : "HDD","SeSz" : "512B","Model" : "ST500DM002-1BD142","Sp" : "U","Type" : "-"
                            },{
                                    "EID:Slt" : "252:1",{
                                    "EID:Slt" : "252:2","DG" : 1,"Model" : "ST4000NM0033-9ZM170",{
                                    "EID:Slt" : "252:3","DG" : 2,{
                                    "EID:Slt" : "252:4","DG" : 3,{
                                    "EID:Slt" : "252:5","DG" : 4,{
                                    "EID:Slt" : "252:6","DG" : 5,"Type" : "-"
                            }
                    ]
            }
    }
    ]
    }