• ベストアンサー

ハッシュをkeysでうまく抽出できない

atom_seedの回答

  • ベストアンサー
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.2

if文内で上位のキーを不意に作成してしまうのが原因ですね。 上位のキーがあるときに下位のキーを調べるという書き方にすれば解決できますよ。 if ( exists $family{'uncle'} && exists $family{'uncle'}->{age} ) { }

rafysta
質問者

お礼

なるほど、と思いました。 簡潔で、明快な解答をありがとうございます。 思い通りの結果が得られました。

関連するQ&A

  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、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
  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/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
  • Tid::IxHash の使い方

    Tid::IxHash の使い方がよくわかりません。 ハッシュのキーの設定順を保持したいのですが、 以下のどこが間違っているでしょうか? キーの順番はバラバラになってしまいます。 #ハッシュリファレンス2重だと使えない??? use strict; use Tie::IxHash; tie my %{$myhash->{test}}, 'Tie::IxHash'; for(my $i=0; $i<20; $i++) { $myhash->{test}->{$i} = 'kero'; } my @keys = keys %{$myhash->{test}}; print @keys;

    • ベストアンサー
    • Perl
  • 重複する値を表示しない

    以下のようなデータ(CSV)があったとします。 1020,大森,3249 1023,高橋,3252 1020,大森,3249 ここで1020が重複しているので重複させないように printしたいと考えています。ほかにも多数のデータ が重複しているかも知れない。 本を見て、ハッシュのキーは重複しない ことを利用して foreach (@man){ $H{$_}=1; #値は無視しキーにセット } @man = keys %H;  #ハッシュキーを配列へ foreach $eachman (@man) { ($num, $name, $encpass) = split(/,/, $eachman); print ・・・・ ・・・・ のように作ってみましたが、重複されて 表示されます。順番のみ変わっていました。 このような感じで簡単にできる方法がありましたら 教えてください。

    • ベストアンサー
    • Perl
  • Perl 正規表現について

    Perlに関していつもお世話になっております。 今回も正規表現に関する質問をしたいと思います。 「あ、あい、あいう、あいうえ、あいうえお」というハッシュが存在するときに、「{あ}は○○回出ました。」「{あい}は○○回出ました。」とそれぞれ表示させるコードを組もうと思います。 前回までで皆様に教えていただいたことを元に組んでみました。 #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; my %word_of = ( 'あい' => 0, 'あいう' => 0, 'あいうえ' => 0, 'あいうえお' => 0, 'かき' => 0, 'かきく' => 0, 'かきくけ' => 0, 'かきくけこ' => 0, ); foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { if ( $word =~ /$search_key/ ) { $word_of{$search_key}++; } } } foreach my $key ( sort ( keys %word_of ) ) { # utf8, shiftjis eucjp ... print encode( 'utf8', "「$key」 は $word_of{$key} 回出ました" ), "\n"; } これを出来ればeucjpで組みたいのですが、可能でしょうか? 私の思いあたる点、utf8表記の部分をeucjpに直しただけではエラーが出てしまいます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl cgiでnameを

    perl cgiでフォームの行と列を以下のようにハッシュと配列を使って生成しようとしました: my %temp = ( 'test1' => 'テスト1', 'test2' => 'テスト2' ) for (my $linepnt = 1; $linepnt<8; $linepnt++){ foreach my $key (keys(%temp)){ print "<td><input type=\"text\" name=\"$key . '_' . $linepnt\" value=\"$in_data{$key . '_' . $linepnt}\" style=\"width:3em;font-size:medium\">mL</td>"; } } するとフォームからの入力を受けた側ではnameを test1_7 というように受け取らずに test1+.+%27_%27+.+7 と受け取っていることが分かりました。 name=\'test1_' . $linepnt\"  とするだけなら正しく test1_7  として受け取ってくれます。 なにが間違っているのでしょうか。 ご指導ください。

    • ベストアンサー
    • CGI
  • 迷惑をかけるかと思いますが宜しくお願いしますは、どういう表現に置き換えられるでしょう。

    日本の親御さんからホストファミリーへのメッセージとして、こういうのがあります。 「ご迷惑をおかけすることがたくさんあると思いますが、よろしくお願いします。」 「家を離れたことがないので、失礼なことをするかもしれません。」 これを英語にするとどんな選択肢があるのか どなたかお知恵をお貸し願えないでしょうか? I hope my son/daughter won't cause you too much trouble during the homestay. とかでしょうか??? 日本式に、明らかに迷惑をかけるでしょうや かけるかもしれません、は、そぐわないですよね? どなたかそういった表現を訳した経験がある方、お知恵をお貸し下さい。

  • 次の文を否定文に直してください。 お願いします

    1.My daughter is very good at sports. 2.My son went to Frankfurt last week. 3.You must take the dog for a walk. 4.Yukiko was singing a song.5.Be late for the meeting. 6.I have already done my homework. 7.My aunt has a very old coins. 8.I want some old coins. 9.Our teacher shut the door. 10.He has to call on his uncle on his way home.

  • 和訳をよろしくお願いします

    My grandfather passed away last month, and the wake was catered by a close friend of the family who owns a restaurant. He closed off a section of his dining hall for our family. The meal included 15 children under the age of 10, and they were absolute monsters. My nephew threw his shoe across the room and then tripped a waitress. These kids crawled under the tables, poking us with forks and smearing food into the carpet. My cousin's 8-year-old daughter put open condiment packets in my purse and a baked potato in my mother's coat pocket and then mashed it into the fabric. 最後の文の和訳をよろしくお願いします。

  • 英訳を助けてください。

    いつもお世話になります。 英訳できたのは合っていますでしょうか? 英訳できなかった文はずっと考えているのですがわからないので厚かましいですが英訳をお願いします。 今回の地震で私はいろいろ考えさせられました。I had my experience and thought from this earthquake. 結婚3時間後に夫が行方不明になった女性。まだ家族に会えない男性。 The woman that a husband went missing marriage three hours later. The man who cannot see a family yet. 子供が亡くなり、老人が助かる。A child died, and an old man was saved. たくさんの家族が連絡がとれなくなっています。 全ては運命だったのでしょうか。 私が東北に住んでいたら、今日あなたと話していなかったかもしれません。 自分の家族、友達が無事だったことに感謝して私のできることを頑張ります。 I’m just appreciative that my family, friends and acquaintances are all fine, and just want to do whatever I can. 私の同僚達とも被災地の方々の為に何かできないかTVの前ではがゆく思っています。