perlなのですが、

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/03/28 20:16:57
  • 終了:2007/04/04 20:20:03

回答(4件)

id:ToMmY No.1

ToMmY回答回数656ベストアンサー獲得回数192007/03/28 20:36:13

ポイント23pt

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

id:gakio

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

2007/03/28 21:47:42
id:tombe No.2

tombe回答回数38ベストアンサー獲得回数72007/03/28 23:44:17

ポイント22pt

まず、ハッシュ(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;

id:gakio

なるほど!ではsortを使わない状態だと、

20 10 30 って表示されることもあるわけですね?

2007/03/29 01:34:56
id:kurukuru-neko No.3

kurukuru-neko回答回数1844ベストアンサー獲得回数1552007/03/28 22:21:10

ポイント23pt

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

  • sort key ---

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

id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402007/03/29 10:00:54

ポイント22pt

連想配列 - Wikipedia

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

連想配列とは?

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

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


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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません