• ベストアンサー

perlのデータ構造? デバッグに使いたい

Perlでよく ハッシュをprintした場合、 HASH(0x2241be4)と表示されますが、 こちらがハッシュを意識しなくてもだいたいの構造が わかるように整形・表示して、具体的な中身を 表示させたいのですが可能でしょうか?

  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.2

# Data::Dumperなどはどうでしょう? use Data::Dumper; my $foo = { a=>'A', b=>[ 1,2,3 ] }; print Dumper( $foo );

その他の回答 (1)

回答No.1

それはハッシュのリファレンス(参照アドレス)です。 print $hash;みたいな形で出力していませんか? my %hash; と定義されたハッシュ自体を出力するだけなら、 print %hash とすると、キーと値が順番に連結された状態で出力できます。 別々に分けるなら、each関数を使って while(($key,$value) = each %hash){ print "$key => $value\n"; } としてあげればOKです。 変数がリファレンスだった場合、ref関数でどの型のリファレンスかがわかりますので、型別に分岐処理をすればいいです。 参考URLの「ハッシュ」「リファレンス」の項が参考になると思います。

参考URL:
http://www.rfs.jp/sb/perl/index.html

関連するQ&A

  • Perlのデータ構造について

    Perlのデータ構造でわからないところがあります。 ハッシュの配列で、以下の構造がある場合 my %hash_array = ( 1=>["aaa", "bbb"], 2=>["ccc", "ddd", "eee"], 3=>[], 4=>["fff"] ); print $hash_array{1}[0]; # aaaが表示される。 print $hash_array{2}[2]; # eeeが表示される。 ですが、 $hash_array{1}は 2 $hash_array{2}は 3 $hash_array{3}は 0 $hash_array{4}は 1 のように個数を表示させるのは、どうすればよいでしょうか? Perlのデータ構造に詳しいサイトや書籍はありますか? また、Perl 5.6.1から Perl 5.8.7に乗りかえようとしていますが、 データ構造など大幅に変わった点はあるのでしょうか?

    • ベストアンサー
    • Perl
  • perlについて

    perlのなかにリファレンスの機能がありますが%hashって ハッシュがじぜんに定義されている状態で $fields=\%hash; $form{field}=$fields; $form{field}=$fields; $item=\%form; という構造の$item変数があります。 一行で$itemから%hashを呼び出す時の書き方 を教えてください。

    • ベストアンサー
    • Perl
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、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; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • ハッシュキーの内容について

    こんばんは。perlをはじめて一ヶ月あまりの初心者です。 また疑問に思うことが見つかり、質問させていただきました。 以下のようなコードがあります。 ----------------------------------------- my @array = ( 'a','b','c'); my %hash; for (@array) {   $hash{$_}{OK} = 1;   $hash{$_}{WAVE} = 2;   $hash{$_}{Perl} = 3; } print $hash{a}->{OK}; print $hash{"b"}->{WAVE}; print $hash{c}->{"Perl"}; ----------------------------------------- 1、2、3を格納するときなのですが、 ハッシュのキーになる値(OK、WAVE、Perl)は、 ダブルクォートや、シングルクォートで囲っていません。 でも、エラーも発生せず、普通に実行できてしまいます("123"を表示します)。 ハッシュのキーは、 "OK","WAVE"や、'Perl'のように ダブルクォートや、シングルクォートで 囲む必要はないのでしょうか?? C言語みたいに厳密に型が決まっているわけではないので、 OKでも"OK"でもよいのかなー、という思いはあるのですが、、、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Ruby 2次元のハッシュ

    Rubyで2次元のハッシュを扱いたいです。 perlで書くと以下のような感じです。(最近perlに疎遠なので自信無いですが^^;) hash{$key1}{$key2}=$value; foreach $key1 (keys %hash){ foreach $key2 (keys %{$hash{$key1}}){ print "$hash{$key1}{$key2}\n"; } } Rubyだとどんな感じになりますか?

  • 二次元配列のハッシュ版の記述方法?

    二次元配列のハッシュ版を実現させたいのですが、 以下の記述で正しいでしょうか? 構文に疎いので教えてください。 #!/usr/bin/perl %HASH_TEST = ( 'あ'=>{'A'=>'1', 'B'=>'2', 'C'=>'3'}, 'い'=>{'A'=>'4', 'B'=>'5', 'C'=>'6'}, ); print $HASH_TEST{'い'}{'B'}; #=> 5が表示されます。 exit; __END__

    • ベストアンサー
    • Perl
  • Perl連想配列の使い方について

    はじめまして。 現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。 そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか? 以下のようなコードです。 ==================================== my @arr = ( "一" , "ニ" , "三" , "四" ) ; my %data ; $data->{0} = \@arr ; $data{0}{test} = "テスト" ; print ${$data->{0}}[1] . "\n" ; print $data{0}{test} . "\n" ; ==================================== 出力はこのようになります。 ニ テスト ここからが質問なのですが、$data->{0}という書き方ができる理由が分からないのです。 $dataが例えば、 my %my_hash ; my $data = \%my_hash ; というように、ハッシュのリファレンスであるならば、$data->{0}という書き方も分かるのですが、定義した時点でリファレンスではない、$dataに、何故"->"の演算子が使えるのでしょうか? とはいえ、 ref $data ; の戻り値がHASHとなるのも確認しています。 これもどうしてそうなるのか、根本的な原理が分かっておりません。 どうか、このコードの動作原理を教えていただけないでしょうか。 抽象的な質問となっている気がしますが、宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 【初歩的質問】重複データがある時のハッシュへの代入について

    perl5.8です。すごくしようもない質問で申し訳ないのですが、次のようなファイルfile.txtの内容を、ハッシュ%hashに入れていくとします。 --- file.txtの中身 --- a,1 c,3 a,1 b,2 c,3 ----------------------- --- ソース(抜粋) ----- open(IN, "file.txt"); @data = <IN>; close(IN); %hash = (); foreach(@data){ chomp $_; @out = split(/,/, $_); $hash{$out[0]} = $out[1]; } ----------------------- 上記の結果は当然ながら、$hash{a}=1,$hash{c}=3,$hash{b}=2となるのですが、重複したデータを読み込んでハッシュに入れようとした時に、ワーニングなりエラーがなにも出なかったのがちょっと気持ち悪いです。重複したキーを読み込んだ時は、内部的には黙ってはじいてくれていると解釈してよいのでしょうか?そうだとすると、こういう書き方は、重複した行を排除するテクニックとなりえるのでしょうか?

  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • foreach内での$_の書き換え

    数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう