2

Googleで検索しましたが、有用なものは見つかりませんでした。

Perl のチュートリアルはたくさんありますが、キーごとに異なる値を持つハッシュについて言及しているチュートリアルは見つかりませんでした。そのようなことはPerlで可能ですか?

たとえば、次のような 2 つのキー ( a, b)を持つハッシュが存在する可能性があります。

$myhash{"a"}=1;
$myhash{"b"}=[ 'hamnet', 'shakespeare', 'robyn', ];

上記は可能ですか?


私はこれを試しました:

#!/usr/bin/perl

use strict;
my %x;

$x{"a"}="b";
$x{"b"}=['c','d'];

foreach (keys %x)
{
  print $_."\n";
  print "$x{$_}";
}

しかし、それは出力しています:

a
bb
ARRAY(0x1ece50)

このハッシュの要素にアクセスする方法について混乱しています。

私は Perl を少し知っていますが、ハッシュに関してはまったくの初心者であることをお伝えしたいと思います。


OK、1 つ見つけました — ハッシュ内の配列にアクセスするには、次のことを行う必要があります。

@{$x{"b"}}

しかし、先ほど説明したように、ハッシュの値は配列またはスカラー値のいずれかになる可能性があるため、上記のハッシュにアクセスするには、最初に値の型を識別してからアクセスする必要があります。これどうやってするの?つまり、キーの値がスカラー、配列、またはハッシュのいずれであるかをどのように識別できますか?

4

3 に答える 3

3

「Perl のチュートリアルはたくさんありますが、キーごとに異なる値を持つハッシュについて言及しているチュートリアルは見つかりませんでした。Perl でそのようなことは可能ですか?」

Perl ディストリビューションに含まれているチュートリアルを見てみたことがあるかもしれません。これには、Perl Data Structures Cookbook (perldsc)が含まれています。これには、 「より精巧なレコード」に関する章が含まれており、値が異なる型を持つハッシュを作成および使用する方法の例が示されています。

「しかし、私が言ったように、ハッシュの値は配列またはスカラー値のいずれかになる可能性があるため、上記のハッシュにアクセスするには、最初に値のタイプを識別してからアクセスする必要があります!どうすればこれを行うことができますか? ? つまり、キーの値がスカラー、配列、またはハッシュのいずれであるかをどのように識別できますか?"

あなたは参照ref演算子の使用に慣れていないようなので、参照に関するMark の非常に短いチュートリアル (perlreftut) も参照してください

これらのチュートリアル (およびその他の多く) はすべて Perl ディストリビューションに既に付属しており、次のように入力してアクセスできます。

perldoc perlreftut

コマンドラインで。(一部のシステムでは、コマンドを有効にするために追加のパッケージをインストールする必要がある場合がありperldocます。Perl プログラミングを行う予定がある場合は、これを強くお勧めします。)

于 2013-01-19T15:25:09.733 に答える
3

私はこれがあなたが望むものだと思います:

 #!/usr/bin/perl -w
 use strict;
 my %x;

 $x{"a"}="b";
 $x{"b"}=['c','d'];


 foreach my $a (keys %x)
 {
     if ( ref $x{$a} eq 'ARRAY' )
     {
         foreach my $b ( @{ $x{$a} } )
         {
             print $b."\n";
         }
     }
     else
     {
         print $x{$a}."\n";
     }
 }

出力:

# perl test.pl 
b
c
d

ハッシュ値が「ARRAY」参照であるかどうかを確認してください。はいの場合は、配列を反復処理して値を出力します。それ以外の場合は、ハッシュ値をすぐに出力します。

于 2013-01-19T13:51:19.193 に答える
1

したがって、上記のハッシュにアクセスするには、最初に値のタイプを識別してからアクセスする必要があります!.どうすればこれを行うことができますか? つまり、キーの値が単数、配列、ハッシュのいずれであるかをどのように識別できますか?

これを行うためのクリーンな解決策はto_string、値がスカラー、配列参照、またはハッシュ参照 ([...]作成するもの: 匿名配列への参照) であるかどうかを識別する単純な関数 (より深くネストされた構造のサポートなし) を作成することだと思います、 perlreftutを参照してください)。refの詳細を参照してください。

sub to_string {
    my $thing = shift;

    for (ref $thing) {

        # join with comma if $thing is an array ref
        return join ', ' => @$thing when 'ARRAY';

        # join key-value list with comma if $thing is a hash ref
        return join ', ' => map {"$_ => $thing->{$_}"} keys %$thing when 'HASH';

        # else: simply return the $thing itself
        return $thing;
    }
}

簡単なサンプルプログラムで

my %data = (
    foo => 42,
    bar => [1, 2, 3],
    baz => {a => 'yay', b => 'nay'},
);

for my $key (keys %data) {
    say "$key: " . to_string($data{$key});
}

次の出力が得られます。

bar: 1, 2, 3
baz: a => yay, b => nay
foo: 42

あなたがしなければならないことに注意してください

use feature qw(say switch);

このプログラムのために。チッ!:)

于 2013-01-19T14:05:48.277 に答える