0

次のような配列とハッシュのハッシュがあります。

$VAR1 = \{
           'abc' => {
                       'def' => 'WorkSet',
                       'products' => [
                                       {
                                         'prodtype' => 'Dell',
                                         'product' => 'Powerconnect-5600'
                                       },
                                       {
                                         'prodtype' => 'Dell',
                                         'product' => 'R-720'
                                       },
                                       {
                                         'prodtype' => 'Dell',
                                         'product' => 'R-920'
                                       }
                                     ]
                     },
        '123' => {
                        '456' => 'WorkSet',
                        'products' => [
                                        {
                                          'prodtype' => 'Dell',
                                          'product' => '210'
                                        },
                                        {
                                          'prodtype' => 'Dell',
                                          'product' => 'TZ-200'
                                        },
                                        {
                                          'prodtype' => 'Dell',
                                          'product' => 'TZ-200'
                                        },
                                       ]
          }
 }

私はそのようなものを持ちたい:

  Branch: Workset
  Build Number: abc
  product : Dell producttype : PowerConnect-5600
  product : Dell producttypr : R-720
  product : Dell producttype : R-920

ハッシュ値 123 も同じはずです。

上記のハッシュを個別に参照することは知っていますが、ループで実行するのは難しいと感じています。

ご指導をお願いします。

参考までに、Data:Dumper perl モジュールを使用して上記のハッシュをリストしました。

        This is what I thought and tried but not getting the required answer in loops:

  my @unique = uniq @version;
  foreach $version(@ unique){
  my $i=0;
  print "$list->{$version}{branch}\n";
  print "$list->{$version}->{products}->[$i]->{product}\n";
  $i=$i+1;
  } where @unique = qw (abc,123)
4

4 に答える 4

1

質問はすでに回答され、受け入れられていますが、とにかくトラップを開けなければなりません...

まず、あなたの構造はオフだと思います。次のようになります。

$VAR1 = {
          '123' => bless( {
                            'ARRAY' => [
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => '210'
                                                }, 'Product' ),
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => 'TZ-200'
                                                }, 'Product' ),
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => 'TZ-200'
                                                }, 'Product' )
                                       ]
                          }, 'Build' ),
          'abc' => bless( {
                            'ARRAY' => [
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => 'Powerconnect-5600'
                                                }, 'Product' ),
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => 'R-720'
                                                }, 'Product' ),
                                         bless( {
                                                  'PRODUCT' => 'Dell',
                                                  'TYPE' => 'R-920'
                                                }, 'Product' )
                                       ]
                          }, 'Build' )
        };

これは、必要な出力に基づいています。製品のリストで構成されるビルドがあるようです。商品は、商品タイプ商品説明で構成されます。元の構造には次のものがあります。

 `456` => Workset`

しかし、構造のこの部分は意味がなく、使用しません。これがBranch Typeであるという意味でしょうか? 言うのが難しい。私が理解していない他のすべてを聞かせてください、私はそれを無視しました。

では、この構造をどのように解析すればよいでしょうか。Perl オブジェクト指向プログラミングを使用する必要があります。これにより、データ構造について心配する必要がなくなります。クラス定義がそれを処理します。これがハッシュの配列なのか、ハッシュの配列なのか、ハッシュの配列なのか心配する必要はありません。

これがメインプログラム全体です。2 つのループ: 最初のループでは、データ (ビルド番号、Prodtype、製品の 3 つのタブで区切られた項目で構成) を読み込みます。わかりやすく、短く、わかりやすいです。データ構造全体を解析するには、わずか 6 行のコードが必要です。

use strict;
use warnings;
use feature qw(say);

my %workset;
my $prev_build;

#
# Read in the Data
#
while ( my $line = <DATA> ) {
    chomp $line;
    my ($build_num, $prodtype, $description) = split /\t/, $line;
    my $product = Product->new( $prodtype, $description );
    if ( not $prev_build or $prev_build ne $build_num ) {
        $workset{$build_num} = Build->new;
        $prev_build = $build_num;
    }
    $workset{$build_num}->Push($product);
}

#
# Parse the structure and Print it out
#
for my $workset ( sort keys %workset ) {
    say "Build Number: " . $workset;
    while (  my $product = $workset{$workset}->Pop ) {
        say "Product: " . $product->Product . " Prodtype: " . $product->Type;
    }
}

出力は次のとおりです。

Build Number: 123
Product: Dell Prodtype: TZ-200
Product: Dell Prodtype: TZ-200
Product: Dell Prodtype: 210
Build Number: abc
Product: Dell Prodtype: R-920
Product: Dell Prodtype: R-720
Product: Dell Prodtype: Powerconnect-5600

あなたが望んでいたように。

私のプログラムの残りはクラス定義です。ほとんどの場合、定義をメイン プログラムの最後に追加するだけです。それでも、オブジェクト指向コードを使用すると、プログラミングがより速く簡単になります。

そして、これが私のプログラムの残りの部分です:

package Product;

sub new {
    my $class   = shift;
    my $product = shift;
    my $type        = shift;

    my $self = {};
    bless $self, $class;

    $self->Product($product);
    $self->Type($type);

    return $self;
}

sub Product {
    my $self        = shift;
    my $product = shift;

    if ( defined $product ) {
        $self->{PRODUCT} = $product;
    }
    return $self->{PRODUCT};
}

sub Type {
    my $self = shift;
    my $type = shift;

    if ( defined $type ) {
        $self->{TYPE} = $type;
    }
    return $self->{TYPE};
}

package Build;
use Carp;

sub new {
    my $class = shift;

    my $self = {};
    bless $self, $class;

    return $self;
}

# PRIVATE -- No peeking
sub _Array_ref {
    my $self = shift;

    if ( not exists $self->{ARRAY} ) {
        $self->{ARRAY} = [];
    }
    return $self->{ARRAY};
}

sub Index {
    my $self  = shift;
    my $index = shift;

    if ( not defined $self->{INDEX} ) {
        $self->{INDEX} = 0;
    }

    if ( defined $index ) {
        $self->{INDEX} = $index;
    }

    if ( $self->{INDEX} < 0 or $self->{INDEX} > $self->Size ) {
        croak qq(Index out of range: Set to "$index");
    }

    return $self->{INDEX};
}

sub Array {
    my $self = shift;
    my @array = @{ $self->_Array_ref };

    return wantarray ? @array : \@array;
}

sub Size {
    my $self = shift;

    my $array_ref = $self->_Array_ref;
    return $#{ $array_ref };
}

sub Push {
    my $self    = shift;
    my $product = shift;

    if ( not defined $product or not $product->isa("Product") )  {
        croak qq(Push Method for requires a Product Class to push);
    }

    my $array_ref = $self->_Array_ref;
    push @{ $array_ref }, $product;

    return $#{ $array_ref };
}

sub Pop {
    my $self = shift;

    my $array_ref = $self->_Array_ref;
    return pop @{ $array_ref };
}

sub Next {
    my $self = shift;

    my $index = $self->Index;
    my $array_ref = $self->_Array_ref;
    $index += 1;
    $self->Index($index);

    return ${ $array_ref }[$index];
}

sub Prev {
    my $self = shift;

    my $index = $self->Index;
    my $array_ref = $self->_Array_ref;
    $index -= 1;
    $self->Index($index);

    return ${ $array_ref }[$index];
}

package main;

__DATA__
abc Dell    Powerconnect-5600
abc Dell    R-720
abc Dell    R-920
123 Dell    210
123 Dell    TZ-200
123 Dell    TZ-200
于 2013-08-01T22:42:13.043 に答える
0

これも機能します:

    while (my ($build_num, $href) = each %$list) {
    my ($branch, $aref, $username);
    $aref = $href->{'products'};
    $branch = $href->{branch};
    $username = $href->{user};

    for my $href (@$aref) {
     print "product: $href->{prodtype}     prodtype: $href->{product}       qbs_id:$href->{qbs_id}\n";
   }

refを使用せずにいくつかの簡単な変更を加えて@Chrisの回答を編集しました..ありがとう

于 2013-08-06T00:28:53.880 に答える