人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlなのですが、
#!usr/bin/perl
%toshi=("black"=>10,"red"=>20,"blue"=>30)
@color=value%toshi;
print "@color\n";
exit;
この答えは、
30 20 10でしょうか?
その場合その理由、を押していただきたいです。
10 20 30ではないの?

●質問者: gakio
●カテゴリ:ウェブ制作 学習・教育
✍キーワード:Blue COLOR EXIT Perl print
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ToMmY
●23ポイント

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となっているのは、値や変数名が違えば違ったり、再起動しただけでも変わったりするかもしれません。これをデータとして使うのは不具合を招くので使わないほうがいいですね。

◎質問者からの返答

問題集が、どちらの答えであっても、おかしくはないということでしょうか?普通は102030の順だと思いますよね?


2 ● tombe
●22ポイント

まず、ハッシュ(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 って表示されることもあるわけですね?


3 ● kurukuru-neko
●23ポイント

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の連想配列はハッシュでなく

配列の添え字に文字列が使われている

配列なので順序が保障されます。

http://jp.php.net/manual/ja/language.types.array.php


4 ● b-wind
●22ポイント

連想配列 - Wikipedia

連想配列の実装にはいろいろ有りますが、Perl はハッシュを使用します。そのため順序を保証することは出来ません。

連想配列とは?

また、同じく大抵の言語で順序は保証されないはずです。

「配列」と付いているので誤解しやすいですが。


あえて順序を固定したければ、自分ならこうします。

foreach my $key ( sort keys %toshi ) {
 print "key:$key value:$toshi{$key}\n";
}
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ