• ベストアンサー

Perl 順序が!?

#! usr/bin/perl %toshi=("suzuki"=>24,"sato"=>26,"tanaka"=>32); foreach $key(keys(%toshi)){ print "($key,$toshi{$key})\n"; } exit; とありますが、どうして結果表示が (tanaka,32) (suzuki,24) (sato,26) となるのでしょうか? (suzuki,24) (sato,26) (tanaka,32) なぜこれにはならないのですか?

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 関数 keys() は、必ずしも代入した順序でキーを返すとは限りません。  これは Perl の仕様で、メモリ内のあらかじめ確保された領域に手当たり次第に詰め込む、という動きをするからのようです。  どうしても順序を保証したければ、通常の配列を使う方法を検討したほうがいいかと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

まあハッシュがどのように実現されているかを考えれば想像がつくのですが それはおいといて、 このような質問はよくあるようで、FAQにもあります。 どうやればわたしのハッシュを要素を挿入した順序を覚えておくようにできますか? http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_make_my_hash_remember_the_order_i_put_elements_into_it モジュールを使ってお望みの動作をするようにすることはできます。 いくつかあるようですが、上記のFAQのものに加えて Perl Training Australia - Ordered hashes http://perltraining.com.au/tips/2005-06-29.html を紹介しておきます。

全文を見る
すると、全ての回答が全文表示されます。
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

perlのハッシュ(連想配列)ではkeyの順序を保持しません。 これは別にperlに限った話ではなく、 ハッシュテーブルを採用した場合はその特性上、順序は保証されないのが普通です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Perlを使った単語出現カウント

    コマンドライン引数で 入力ファイルからデータ受け取って結果を出力ファイルに書き込みたいのですが、プログラムは #!/usr/bin/perl while ( <> ) { @words = split(" "); $wc{@words[0]} += 1; } foreach $key (keys %wc) { print "$wc{$key} $key\n"; } で今のコードでは、コンソールに出力されるだけとなってしまいます。 ファイル入出力を行うにはどうすればいいですか?

    • ベストアンサー
    • Perl
  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • 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 ハッシュ エラー

    現在perlの勉強中で、ハッシュの項目まできました。しかし、use strictにするとこのコードがエラーになります。 #!/usr/bin/perl use strict; use warnings; print "Content-type:text/html\n\n"; $hoge{"key1"} = "value1"; print $hoge{"key1"}; exit; ヴァージョンは5.8.9です。use strictをコメントアウトすればエラーはでません。どうしてエラーになってしまうのでしょうか?どうすればエラーを出さずに表示することができるのでしょうか?どうかご教授ください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl からbashを呼び出したい

    Perlからbashのファイルを呼び出そうとしています。 sendmail2.cgiは、呼び出せていまが、 sendmail3.cgiは、呼び出せません。 bashのファイル自体は、./(bashファイル)とやると実行できます。 パーミッションは、 sendmail3.cgi 655 mail_plain.sh 755 sendmail2.cgi 705 mailsend.sh 705 です。 パスの設定の問題かとも思ったのですが、よくわかりません。 宜しくお願いします。 ===sendmail2.cgi============= #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>sendmail test</P>\n"; print "mailtest\n"; print "</HTML>\n"; exec('/home/httpd/wwwroot/yoshida/mailsend.sh'); exit(0); ============================== ===sendmail3.cgi============= #!/usr/bin/perl exec("/home/httpd/wwwroot/bbstest/mail_plain.bash"); exit(0); ==============================

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • どうしてもCookieとCGI・perlの関係?が理解できない。

    ととろさんのところを(http://tohoho.wakusei.ne.jp/www.htm)みながら、なんとかPerl・CGIを勉強しているところです。 普通にフォームに入力されたものをログファイルにとる、などはできるようになったのですが、 どうしてもクッキーのところでつまづいてしまいます。 Cookie書き込みの例、のところに、 Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59; とやったら、tanakaというクッキーが作成されるのでしょうか? どうしてもこの辺がわからないのです。 これを実行する場合、 #!/usr/local/bin/perl print "Content-type:text/html\n"; print "Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;" print "\n"; のようにやるのですか? 最終的にはフォームの入力値を取得・反映したいと考えているのですが…。 あちこちわかりやすいと言われるcgi・PERL解説サイトをみたのですが、どうしてもここだけが理解できませんでした。

    • ベストアンサー
    • CGI
  • エラー表示

    CGIがエラーを出すと、サーバーが500番エラーを表示しますよね。 そのページを.htaccessのErrorDocumentを使って、自分で定義したものにできたのですが、そのエラーページをCGIにして、どこかにエラーになったページが吐いたエラー出力が入ってないかと思ったのですが、入ってないのでしょうか? -------- #!/usr/bin/perl # hoge.cgi # エラーするCGI die "hoge!"; -------- #!/usr/bin/perl # error.cgi # 500エラーページなCGI print "$_: $ENV{$_}<br>\n" foreach(sort keys %ENV); # ここでもない print foreach(<STDIN>); # ここでもない print foreach(<STDERR>); # ここでもない print ・・・どこかに "hoge!" が入ってないでしょうか? -------- # .htaccess ErrorDocument 500 /error.cgi Apache/1.3.24 Server perl 5.005_03 built for sun4-solaris

    • 締切済み
    • CGI
  • 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だとどんな感じになりますか?

  • perlでLocation

    Locationでは#xxxというのは使えないのでしょうか? #!/usr/local/bin/perl print "Location:xxx.cgi#xxx/?userID=$name\n\n"; exit; という風に書いています。 xxx.cgiはローカルにあるcgiでそのcgiの中身は表示できます。 しかしxxx.cgiの中の <xxxx.cgiの中身> print <<"EOM"; <html> . . . <A NAME="xxx>image</A> . . . </HTML> EOM exit; xxxのところでなく一番最初が表示されてしまいます。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
塗膜分析におけるSEM-EDSの重要性
このQ&Aのポイント
  • 塗装品の塗装浮きの原因を解明するため、SEM-EDSによる塗膜分析が注目されています。
  • 塗装上に付着した成分の有無をSEMで確認することができ、有機溶剤のような成分が原因であれば塗膜にはほとんど残っていない可能性が高いです。
  • ただし、塗膜自体がC,Oで構成されているため、SEMでの観察は難しい場合もあります。
回答を見る

専門家に質問してみよう