• ベストアンサー

ハッシュの中身の表示

ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sample_
  • ベストアンサー率76% (20/26)
回答No.2

>当然、test の戻り値は、スカラーとハッシュです。 上記より >my ($return_code, %hash_data) = test(); こう書いてしまいたくなるのですが perlの変数の扱いは 一個のデータならばスカラー$ 複数のデータならば配列@ そして、キーと値のセットならばハッシュ% なので >ハッシュを戻すときには参照渡し記号の\もつけています。 リファレンスのお話ですね。 参照渡しということは、データが保存されている場所を渡して あげるわけなので、場所情報は、1個のデータなのでスカラーに 保存します。 そんなわけで、回答者のNo.1さんの例4のようになりますね。 ただし、参照渡し(リファレンス)はあくまでも、データの 保存されている場所を渡してあげているだけなので実際の データを参照しなおす(デリファレンスする)ためには、 @{$ref_data} ←配列のリファレンスをデリファレンスするなら@をつける %{$ref_data} ←ハッシュのリファレンスをデリファレンスするなら%をつけてあげればOKです。 {}中括弧は、あってもなくても問題ありません。(要は省略可能) 私の場合は、中括弧をつけておいた方がパット見てすぐに デリファレンスしてるって理解できるので視認性の都合上 つけるようにしています。

TeferiMage
質問者

お礼

> 場所情報は、1個のデータなのでスカラーに > 保存します。 ありがとうございます! ハッシュを、1つのかたまりとして扱うということだったのですね! 受け取り手、渡し手の両方で、 ハッシュをスカラー記号で一括の取扱できるように渡したところ、 うまくいきました! ありがとうございました!

その他の回答 (1)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

ハッシュへの代入法を誤解されていませんか? 以下が正しい例で、2例は等価です。 例1 my $sc = 'val'; my %hs = ('k1', 'v1'); 例2 my ($sc, %hs) = ('val', 'k1', 'v1'); 質問文から察するに、例3 と同様に書かれたんでしょうか? これは誤りです。 参照渡しをしたいなら、例4でどうぞ。 例3 (間違い) my ($sc, %hs) = ('val', {'k1', 'v1'}); 例4 my ($sc, $hs) = ('val', {'k1', 'v1'}); print $hs->{'k1'}, "\n"; foreach my $key (keys(%{$hs})) { ...... } # この場合は %{$hs} より %$hs の方が見やすいかも。

TeferiMage
質問者

お礼

ありがとうございます! ハッシュを、1つのかたまりとして扱うときは、 スカラー変数の記号によって扱うということを誤認していました!