4

テキスト入力に基づいてperlでネストされたハッシュを作成する方法を理解するのに問題があります。

私はこのようなものが必要です

my % hash = {
key1 => \%inner-hash,
key2 => \%inner-hash2
}

ただし、私の問題は、アプリオリに内部ハッシュがいくつあるかわからないことです。そのために、次のスニペットを作成して、str変数をループで作成し、その参照を配列に格納して後で逆参照できるかどうかをテストしました。

{
    if($line =~ m/^Limit\s+$mc_lim\s+$date_time_lim\s+$float_val\s+$mc\s+$middle_junk\s+$limit  \s+$value/) {
        my $str = $1 . ' ' . $2 . ' ' . $7;
        push (@test_array_reference, \$str);
     }
}
foreach (@test_array_reference) {  
    say $$_;
}

Perlは、スカラーではない実行時エラーで終了します。私はここで少し迷っています。どんな助けでもありがたいです。

4

3 に答える 3

7

最初の(メイン?)質問に答えるために、テキストをウォークスルーして作成する場合に作成するハッシュの数を知る必要はありません。この例では、スペースで区切られた文字列の単語をキーとして使用していますが、目的に応じて任意の入力テキストを使用できます。

my $text = 'these are just a bunch of words';
my %hash;

my $hashRef = \%hash;           # create reference to initial hash
foreach (split('\s', $text)){
    $hashRef->{$_} = {};        # create anonymous hash for current word
    $hashRef = $hashRef->{$_};  # walk through hash of hashes
}

任意の内部ハッシュを参照して、次のように値を設定することもできます。

$hash{these}{are}{just}{a}{bunch}{of}{words} = 88;
$hash{these}{are}{just}{a}{bunch}{of}{things} = 42;
$hash{these}{things} = 33;

これを視覚化するには、Data:Dumper役立つかもしれません、

print Dumper %hash;

生成する、

$VAR1 = 'these';
$VAR2 = {
          'things' => 33,
          'are' => {
                     'just' => {
                                 'a' => {
                                          'bunch' => {
                                                       'of' => {
                                                                 'things' => 42,
                                                                 'words' => 88
                                                               }
                                                     }
                                        }
                               }
                   }
        };
于 2013-03-24T19:26:11.777 に答える
3
my $hashref = { hash1 => { key => val,... },
                hash2 =>  { key => val,..}  };

また、正規表現で修飾子を使用することもできますがm//x、そのままではほとんど読めません。

于 2013-03-24T17:56:48.317 に答える
3

ハッシュのハッシュの作成は非常に簡単です。

my %outer_hash = {};

完全に必要というわけではありませんが、これは基本的に、ハッシュの各要素が別のハッシュへの参照であることを意味します。

従業員番号でキー設定された従業員ハッシュを想像してみてください。

$employee{$emp_num}{first} = "Bob";
$employee{$emp_num}{last}  = "Smith";
$employee{$emp_num}{phones}{cell} = "212-555-1234";
$employee{$emp_num}{phones}{desk} = "3433";

この表記の問題は、しばらくすると読みづらくなることです。矢印表記を入力します。

$employee{$emp_num}->{first} = "Bob";
$employee{$emp_num}->{last}  = "Smith";
$employee{$emp_num}->{phones}->{cell} = "212-555-1234";
$employee{$emp_num}->{phones}->{desk} = "3433";

このような複雑な構造の大きな問題は、use strictエラーを見つけることができなくなることです。

$employee{$emp_num}->{Phones}->{cell} = "212-555-1234";

おっと!Phonesの代わりに使用しましたphones。このタイプの複雑な構造を使い始めるときは、オブジェクト指向の構文を使用する必要があります。幸い、perlobjチュートリアルは非常に理解しやすいものです。

ちなみに、複雑なデータ構造の処理とオブジェクト指向のPerlを使用する機能により、あなたは大きなリーグに入ることができます。これは、より強力で複雑なPerlを作成するための最初のステップです。

于 2013-03-24T22:07:40.513 に答える