2

私はハッシュとハッシュ参照に慣れていないので、あなたが助けてくれることを望んでいる質問がありますか?

次のデータ構造があります。

$VAR1 = {
    'http://www.superuser.com/' => {
        'difference' => {
            'http://www.superuser.com/questions' => '10735',
            'http://www.superuser.com/faq' => '13095'
        },
        'equal' => {
            'http://www.superuser.com/ ' => '20892'
        }
    },
    'http://www.stackoverflow.com/' => {
        'difference' => {
            'http://www.stackoverflow.com/faq' => '13015',
            'http://www.stackoverflow.com/questions' => '10506'
        },
        'equal' => {
            'http://www.stackoverflow.com/ ' => '33362'
        }
    }

'difference'キー内のすべての URL にアクセスして、URLに対して他のアクションを実行できるようにしたい場合、これらの要素にアクセスするための正しい方法または推奨される方法は何ですか?

たとえば、次の URL で終了し、foreachループ内で何かを実行できます。

http://www.superuser.com/questions
http://www.superuser.com/faq
http://www.stackoverflow.com/faq
http://www.stackoverflow.com/questions

- - - 編集 - - -

上記のデータ構造のさらに下の要素にアクセスするコード:

my @urls;
foreach my $key1 ( keys( %{$VAR1} ) ) {
    print( "$key1\n" );
    foreach my $key2 ( keys( %{$VAR1->{$key1}} ) ) {
        print( "\t$key2\n" );
    foreach my $key3 ( keys( %{$VAR1->{$key1}{$key2}} ) ) {
        print( "\t\t$key3\n" );
    push @urls, keys %{$VAR1->{$key1}{$key2}{$key3}};
    }
  }
}
print "@urls\n";

上記のコードを使用すると、次のエラーが発生するのはなぜですか?

Can't use string ("13238") as a HASH ref while "strict refs" in use at ....

4

1 に答える 1

7

難しいことではありません。変数内のすべてのキーから2番目のレベルのキーを削除するだけです。

my @urls;
for my $key (keys %$VAR1) {
    push @urls, keys %{$VAR1->{$key}{'difference'}};
}

間接参照に苦労している場合は、ハッシュまたは配列のすべての値がスカラー値にしかなり得ないことに注意してください。マルチレベルのハッシュまたは配列では、レベルは互いに積み重ねられた単一のハッシュ/配列です。

たとえば、次のことができます。

for my $value (values %$VAR1) {
    push @urls, keys %{$value->{'difference'}};
}

または

for my $name (keys %$VAR1) {
    my $site = $VAR1->{$name};
    push @urls, keys %{$site->{'difference'}};
}

..値(ハッシュへの参照)を直接経由するか、キーを介して値を表す一時変数を経由するルートを取得します。perldocperldataで読むべきことがもっとあります。

于 2013-02-20T13:07:52.217 に答える