#!usr/bin/perl
%toshi=("black"=>10,"red"=>20,"blue"=>30)
@color=value%toshi;
print "@color\n";
exit;
この答えは、
30 20 10でしょうか?
その場合その理由、を押していただきたいです。
10 20 30ではないの?
http://smdn.invisiblefulmoon.net/ikimasshoy/perl/learningperl05....
連想配列では基本的に順番という概念はありません。
http://www.tohoho-web.com/lng/199908/99080171.htm
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_lecture.html
># keys関数は連想配列のキーのみからなる配列を返す. values関数は連想配列のバリューのみからなる配列を返す.
> * それぞれ取り出される順番は、決まっていない (実行する度に変化する).
すごくいい加減な言語仕様なんです。
だから30 20 10となっているのは、値や変数名が違えば違ったり、再起動しただけでも変わったりするかもしれません。これをデータとして使うのは不具合を招くので使わないほうがいいですね。
まず、ハッシュ(hash hashing)の概念を押さえておきましょう。
「ハッシュ関数」をキーワードにして検索するのが妥当でしょう。
http://www.google.co.jp/search?num=20&hl=ja&q=%E3%83%8F%...
アルゴリズムの詳細は上記検索結果に委ねますが、要するにハッシュとは → 攪拌する/グチャグチャにする(ハヤシライス/ハッシュドビーフの語源)ですから順番が保証されないのが当たり前です。むしろ順番が保証されてしまってはハッシュの御利益がありません。
どなたかが言われた「Perlがいい加減な言語仕様」という発言は2つの意味で誤りです。
1.ハッシュアルゴリズムが「配列」的な意味で順番を保証していないのは当然。
2.Perlはハッシュアルゴリズムという一般的数理原理を組み込んでいるだけであって、ハッシュアルゴリズム自体はPerlの言語仕様では無い。
蛇足ですが、PHPの連想配列は決して「ハッシュ」ではありません。PHPはハッシュアルゴリズムの利点を放棄した言語です。
これだけでは何ですので、結果を 10 20 30 ... としたい場合の解決方法は以下です。
#!usr/bin/perl
%toshi=("black"=>10,"red"=>20,"blue"=>30);
@color= sort values %toshi;
print "@color\n";
exit;
なるほど!ではsortを使わない状態だと、
20 10 30 って表示されることもあるわけですね?
perl 5.8.8
#!/usr/bin/perl %toshi=("black"=>10,"red"=>20,"blue"=>30); @color=values(%toshi); @keys=keys(%toshi); print "@color\n"; print "@keys\n"; exit;
実行結果は、
30 10 20
blue black red
となります。
パールは連想配列ではなくハッシュされた
関数です。
ハッシュとは、ある特定の文字列を
計算により早く見つける為の方法として
用いられます。
従って、Perlのバージョンや文字列により
その計算が変わりその保存される並びは変化
します。
従って一般的な連想配列とは少し違います。
キー順番にソート表示・処理したい場合は、
#!/usr/bin/perl my %toshi=("black"=>10,"red"=>20,"blue"=>30); my @color=values(%toshi); my @keys=keys(%toshi); print "@color\n"; print "@keys\n"; print "--- sort key ---\n"; for my $key (sort keys %toshi) { print $key."=".$toshi{$key}."\n"; }; exit;
実行結果は
30 10 20
blue black red
black=10
blue=30
red=20
http://www.slogical.co.jp/tech/perl_sort.html
http://www.context.co.jp/perlinfo/tech-notes/lecture-19990223/sl...
http://www.site-cooler.com/kwl/perl/4.htm
PHPの連想配列はハッシュでなく
配列の添え字に文字列が使われている
配列なので順序が保障されます。
連想配列の実装にはいろいろ有りますが、Perl はハッシュを使用します。そのため順序を保証することは出来ません。
また、同じく大抵の言語で順序は保証されないはずです。
「配列」と付いているので誤解しやすいですが。
あえて順序を固定したければ、自分ならこうします。
foreach my $key ( sort keys %toshi ) { print "key:$key value:$toshi{$key}\n"; }
問題集が、どちらの答えであっても、おかしくはないということでしょうか?普通は102030の順だと思いますよね?