0

私はまた立ち往生していて、助けが必要です。いつものように、それは私の宿敵です-ハッシュ。基本的に、私はデータベース、つまりaz/OSメインフレーム上のソフトウェアのすべてのアイテムに書き込もうとしています。私はなんとか次のハッシュに進むことができました:

$VAR1 = {
    'Product' => {
        'Unicenter CA-Deliver Output Management' => {
            'vendorUniqueKeyRef' => 'CA',
            'swUniqueKey'        => 'RMO',
            'description'        => 'Unicenter CA-Deliver Output Management'
        },
        'Unicenter CA-JCLCheck Utility' => {
            'vendorUniqueKeyRef' => 'CA',
            'swUniqueKey'        => 'JCLCHECK',
            'description'        => 'Unicenter CA-JCLCheck Utility'
        },
        'EREP Environmental Recording Edit Print' => {
            'vendorUniqueKeyRef' => 'IBM',
            'swUniqueKey'        => 'EREP',
            'ProductVersion'     => {
                'version'       => '3',
                'swUniqueKey'   => '5658-260',
                'name'          => 'EREP Environmental Recording Edit Print',
                'versionNumber' => '03'
            },
            'description' => 'EREP Environmental Recording Edit Print'
        },
        'SYSQL' => {
            'vendorUniqueKeyRef' => 'SPLWDGRP',
            'swUniqueKey'        => 'SYSQL',
            'ProductVersion'     => {
                'ProductVersionRelease' => {
                    'releaseNumber' => '01',
                    'swUniqueKey'   => 'SYSQL-21',
                    'name'          => 'SYSQL',
                    'release'       => '1'
                },
                'version'       => '2',
                'swUniqueKey'   => 'SYSQL-2',
                'name'          => 'SYSQL',
                'versionNumber' => '02'
            },
            'description' => 'SYSQL'
        },
        '3270-PC File Transfer Program' => {
            'vendorUniqueKeyRef' => 'IBM',
            'swUniqueKey'        => '3270PCFT',
            'description'        => '3270-PC File Transfer Program'
        },
        'Tivoli OMEGAMON XE on z/OS' => {
            'vendorUniqueKeyRef' => 'IBM',
            'swUniqueKey'        => 'OMXEZO',
            'ProductVersion'     => {
                'version'       => '3',
                'swUniqueKey'   => '5698-A59',
                'name'          => 'Tivoli OMEGAMON XE on z/OS',
                'versionNumber' => '03'
            },
            'description' => 'Tivoli OMEGAMON XE on z/OS'
        },
        'Tivoli OMEGAMON XE for Messaging for z/OS' => {
            'vendorUniqueKeyRef' => 'IBM',
            'swUniqueKey'        => 'OMXEMES',
            'description'        => 'Tivoli OMEGAMON XE for Messaging for z/OS'
        },
        'DB2 Utilities Suite for z/OS' => {
            'vendorUniqueKeyRef' => 'IBM',
            'swUniqueKey'        => 'DB2UTSU',
            'ProductVersion'     => {
                'DB2 Utilities Suite for z/OS' => {
                    'swUniqueKey'   => '5655-N97',
                    'version'       => '9',
                    'versionNumber' => '09'
                },
                'DB2 Utilities Suite' => {
                    'swUniqueKey'   => '5697-E98',
                    'version'       => '7',
                    'versionNumber' => '07'
                }
            },
            'description' => 'DB2 Utilities Suite for z/OS'
        },
        'UMB' => {
            'vendorUniqueKeyRef' => 'CSC',
            'swUniqueKey'        => 'CSCUMB',
            'description'        => 'UMB'
        }
    }
};

最初はすべてが良かったので、次のようになりました。

my $sw = $xmldoc->{'Catalog'}->{'Products'};
my %sw = %{ $sw->{'Product'} };

foreach my $product (keys %sw) {
    print "Now processing $product\n";
    my $version;
    my $release;
    my $description        = $sw{$product}{'description'};
    my $vendorUniqueKeyRef = $sw{$product}{'vendorUniqueKeyRef'};
    my $swUniqueKey        = $sw{$product}{'swUniqueKey'};
    if ($sw{$product}{'ProductVersion'}) {
        $version = $sw{$product}{'ProductVersion'}{'version'};
        if ($sw{$product}{'ProductVersion'}{'ProductVersionRelease'}) {
            $release =
                $sw{$product}{'ProductVersion'}{'ProductVersionRelease'}
                {'release'};
        }
        else {
            $release = 0;
        }
    }
    else {
        $version = 0;
        $release = 0;
    }

    my $fullVersion = "$version.$release";

    print "        ***************\n
    The product is: $product\n
    The description is: $description\n
    The vendorUniqueKeyRef is: $vendorUniqueKeyRef\n
    The ProductVersion is: $fullVersion\n
    The swUniqueKey is: $swUniqueKey\n
    ***************\n";
}

ただし、strictを使用しているときに、初期化されていない変数を使用するとエラーが発生し続けました。一部のソフトウェアには「2.2」ではなく「.2」のようなバージョンがあることに気付き、一部の製品が異なるバージョンで2回インストールされているという事実を適切に処理していないことに気付きました。これは、私が愚かに対応していなかったことです。

私はそれを修正しようとしましたが、すべてのバージョンのバージョンに、私が対応しようとしたリリースがあるわけではなく、一度インストールされた場合に限ります......。

HoHとAoHからデータを取得する際の負荷を読みましたが、これを正しく理解することはできません。

基本的に、DBD :: ODBC(プログラムの残りの部分ですでに作業しています)を使用して、このハッシュからデータベースにインストールされたすべてのソフトウェアのリストを取得しようとしています。リリース、複数のバージョン、リリースなし、複数のバージョン......よくわかります......。

私の現在のスタイルとエラーチェックについてのアドバイスと同じくらい、誰もが喜んでくれる助けをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

1

あなたの製品を見てくださいDB2 Utilities Suite for z/OS。キーには、ProductVersion他に2つの製品名があります。他のすべてはそれを持っていません。

'DB2 Utilities Suite for z/OS' => {
  'vendorUniqueKeyRef' => 'IBM',
  'swUniqueKey' => 'DB2UTSU',
  'ProductVersion' => {
    'DB2 Utilities Suite for z/OS' => {
      'swUniqueKey' => '5655-N97',
      'version' => '9',
      'versionNumber' => '09'
    },
    'DB2 Utilities Suite' => {
      'swUniqueKey' => '5697-E98',
      'version' => '7',
      'versionNumber' => '07'
    }
  },
  'description' => 'DB2 Utilities Suite for z/OS'
},

あなたはそれに応える必要があります。XMLデータ用のXMLスキーマはありますか?

于 2012-08-06T20:05:58.173 に答える
1

使っていると思いますXML::Simpleか?XML::LibXMLもしそうなら、またはなどのデータへのXPathのようなアクセスを提供するXMLパーサーを使用する方がはるかに良いでしょうXML::Twig

現状では、ハッシュ構造内の各ステップを指すようにスカラー変数を維持する方がよいでしょう。これにより、要素にアクセスするための複数のキーや、同じハッシュアクセスを繰り返し使用することを回避できます。すべてのハッシュキーと値をコピーしても意味がないため、他のハッシュにコピーする必要はありません。my %sw = %{ $sw->{'Product'} }私はmy $products = $sw->{Product}以下のコードで使用しました、そしてmy $product = $products->{$prodname}そしてmy $pv = $product->{ProductVersion}

ハッシュスライスを使用することもメリットがあり、ハッシュキーの周囲から引用符を削除すると、コードがより明確になります(これは、キーが英数字の場合にのみ機能します)。スライスを使用して、最初の3つの製品パラメーターを1行で引き出します。

これがあなたが私たちに見せたコードの一部の書き直しです。ProductVersion/version最大の変更点は、要素があるかどうかを確認したことです。もしそうなら、私は結合versionProductVersionRelease/release、下からProductVersionそれ以外の場合は、すべての ProductVersion/*要素の下で同じことを行います。定義済み-または、//これらの値が存在しない場合は、これらの値をデフォルトでゼロに設定すると便利です。

これがあなたが望んでいたものに近いことを願っています。

my $products = $sw->{Product};

foreach my $prodname (keys %$products) {

    print "\n\nNow processing $prodname\n";

    my $product = $products->{$prodname};

    my ($description, $vendorUniqueKeyRef, $swUniqueKey) =
            @$product{qw/ description vendorUniqueKeyRef swUniqueKey /};

    my @versions;
    if (my $pv = $product->{ProductVersion}) {
        for my $ver (exists $pv->{version} ? $pv : values %$pv) {
          push @versions, sprintf "%d.%d",
              $ver->{version} // 0,
              $ver->{ProductVersionRelease}{release} // 0;
        }
    } 

    print "***************\n";
    print "The product is: $prodname\n";
    print "The description is: $description\n";
    print "The vendorUniqueKeyRef is: $vendorUniqueKeyRef\n";
    print "The ProductVersion is: $_\n" for @versions;
    print "The swUniqueKey is: $swUniqueKey\n";
    print "***************\n";
}

出力

Now processing DB2 Utilities Suite for z/OS
***************
The product is: DB2 Utilities Suite for z/OS
The description is: DB2 Utilities Suite for z/OS
The vendorUniqueKeyRef is: IBM
The ProductVersion is: 9.0
The ProductVersion is: 7.0
The swUniqueKey is: DB2UTSU
***************

Now processing UMB
***************
The product is: UMB
The description is: UMB
The vendorUniqueKeyRef is: CSC
The swUniqueKey is: CSCUMB
***************

Now processing EREP Environmental Recording Edit Print
***************
The product is: EREP Environmental Recording Edit Print
The description is: EREP Environmental Recording Edit Print
The vendorUniqueKeyRef is: IBM
The ProductVersion is: 3.0
The swUniqueKey is: EREP
***************

Now processing Unicenter CA-JCLCheck Utility
***************
The product is: Unicenter CA-JCLCheck Utility
The description is: Unicenter CA-JCLCheck Utility
The vendorUniqueKeyRef is: CA
The swUniqueKey is: JCLCHECK
***************

Now processing Unicenter CA-Deliver Output Management
***************
The product is: Unicenter CA-Deliver Output Management
The description is: Unicenter CA-Deliver Output Management
The vendorUniqueKeyRef is: CA
The swUniqueKey is: RMO
***************

Now processing 3270-PC File Transfer Program
***************
The product is: 3270-PC File Transfer Program
The description is: 3270-PC File Transfer Program
The vendorUniqueKeyRef is: IBM
The swUniqueKey is: 3270PCFT
***************

Now processing SYSQL
***************
The product is: SYSQL
The description is: SYSQL
The vendorUniqueKeyRef is: SPLWDGRP
The ProductVersion is: 2.1
The swUniqueKey is: SYSQL
***************

Now processing Tivoli OMEGAMON XE for Messaging for z/OS
***************
The product is: Tivoli OMEGAMON XE for Messaging for z/OS
The description is: Tivoli OMEGAMON XE for Messaging for z/OS
The vendorUniqueKeyRef is: IBM
The swUniqueKey is: OMXEMES
***************

Now processing Tivoli OMEGAMON XE on z/OS
***************
The product is: Tivoli OMEGAMON XE on z/OS
The description is: Tivoli OMEGAMON XE on z/OS
The vendorUniqueKeyRef is: IBM
The ProductVersion is: 3.0
The swUniqueKey is: OMXEZO
***************
于 2012-08-06T21:58:58.057 に答える