0

次のことがperlでできるかどうか疑問に思っています。40 ~ 50 行のコードを節約できます。

次のようなハッシュデータ構造があります。

hash_Ref->{a}->{b}->{c}->{d}->{e}->{'count'}=30

私は次のことができる方法があるのだろうかと思っています:

my $hash_ref_1 = ash_Ref->{a}->{b}->{c}->{d};

そして、次を使用します。

$hash_ref_2->{e}. 

要約すると、階層内のポイント「x」までハッシュ参照を変数に格納し、ポイント「x」が指す参照にアクセスしたいと考えています。これは上記の例でより明確になると思います。

詳細

私はいくつかのことを試しましたが、うまくいかないようです。コードをコピーしていますが、ハッシュをコピーしようとしたすべてのものではありません。また、私が得ている出力は次のようなものです

 $VAR1 = {
          'e' => {
                   'count' => 2
                 },
          'c' => {
                   'count' => 2
                 },
          'a' => {
                   'count' => 2
                 },
          'b' => {
                   'count' => 2
                 },
          'd' => {
                   'count' => 2
                 }
        };

私はこのようなものを期待します:

'a' => { 'count' => 2, 'b' => { 'count' => 2, 'c' => ......} }  

ここに私が使用したいくつかのコードがあります:

use strict;
use Data::Dumper;

my @array1 = ('a','b','c','d','e');
my @array2 = ('a','b','c','d','e');
my $hash;

 build_hash(\@array1);
 build_hash(\@array2);


sub build_hash {

    my @array = @{shift @_};

    my $hash_ref;

    for ( my $i =0 ;  $i < scalar @array ; $i++ ){

        print "$i \t $array[$i] \n";
         if ( exists $hash->{$array[$i]} ){

            $hash->{$array[$i]}->{'count'}++;
        }

        else{

            $hash->{$array[$i]}->{'count'}=1;
        }
    }
    print Dumper($hash);

}

サンプル コードで試みたように、perl の要素に基づいて、場合によっては 1 つのループを使用して、ハッシュ参照の階層を構築したいと考えています。

ありがとう!-アビ

4

2 に答える 2

2
# 'a' => { 'count' => 2, 'b' => { 'count' => 2, 'c' => ......} }

sub build_hash {
    $_[0] ||= {};
    my $hash = shift;
    for (@_) {
        $hash = $hash->{$_} ||= {};
        ++$hash->{count};
    }
}

build_hash($hash, @array1);
build_hash($hash, @array2);

自動有効化を使用する場合は、次のように記述できます。

sub build_hash {
    my $p = \shift;
    for (@_) {
        $p = \( $$p->{$_} );
        ++$$p->{count};
    }
}

build_hash($hash, @array1);
build_hash($hash, @array2);

参照:データ::ダイバー

于 2011-05-31T22:53:02.260 に答える
0

これは、あなたが思うように動作するはずです。補足として、時々、ハッシュのハッシュのハッシュのハッシュがある場合...最初に本当に必要だったのは、代わりに $h{"$a,$b,$c"} のような複合キーを持つ 1 つのハッシュでした$h{$a}{$b}{$c}の。心に留めておくべきことがあります。ここに適用されるかどうかはわかりません。

于 2011-05-31T21:46:08.400 に答える