プロが教える店舗&オフィスのセキュリティ対策術

カタカナ3文字と漢字の名前がセットになったデータを、頭文字3文字のカタカナで50音順ソーティングしたいのですが、何故かうまくいきません。
原因と解決法をご教授いただければ幸です。

データは例えば、以下の様なものです。
(以下はプログラムでソーティングした結果ですが、以下のとおり微妙に50音順でソーティングされません)

イジュ 伊集院光
アキモ 秋元康
オグリ 小栗旬
スピッ スピッツ
エハラ 江原啓之
スマッ SMAP
ナカガ 中川翔子
ニュー NEWS
バクシ 爆笑問題
イノウ 井上陽水
ヤマダ 山田太一

----------------

私が試したソーティングプログラムは以下です。

----------------

$space = " ";
foreach $key (sort keys %yomi1) {
print $yomi1{$key}.$space.$title{$key}."<BR>";
;}

----------------

$yomi1{$key}には名前の頭文字カタカナ3文字が入っています。
$title{$key}には漢字の名前が入っています。

以上、よろしくお願い致します。

A 回答 (4件)

手元で確認した限り, perl-5.8.8+EUC, ActivePerl-5.8.6+Shift_JIS のどちらの環境でもなりませんでした.


使われている文字コードとか perl のバージョンはどうなってますか?
    • good
    • 0
この回答へのお礼

Tacosan様
お返事、ありがとうございます。

>手元で確認した限り, perl-5.8.8+EUC, ActivePerl-5.8.6+Shift_JIS のどちらの環境でもなりませんでした.

それは、私と同様に50音順にソーティングされなかった、という意味でしょうか?
それとも、上記の様に変なソーティングはされなかった(=きちんと50音順にソーティングされた)、という意味でしょうか?
教えて下さい。


>使われている文字コードとか perl のバージョンはどうなってますか?

使っている文字コードは、シフトJIS
改行コードはCR+LF
です。

perl のバージョンは、サクラサーバーを使っているので、
5.8.xです。

お手数かけますが、よろしくお願い致します。

お礼日時:2008/05/02 13:11

ハッシュの要素でソートされていらっしゃるようですが


各要素「$key」には何が入っていますか?
    • good
    • 0
この回答へのお礼

ralf124c様へ
ご質問、ありがとうございます。

>ハッシュの要素でソートされていらっしゃるようですが
>各要素「$key」には何が入っていますか?

$keyを表示させる為に、プログラムを以下の様に改造しました。

----------------

foreach $key (sort keys %yomi1) {
print $yomi1{$key}.$space.$title{$key}."●KEYは".$key."<BR>";
;}


----------------

そして、表示させたところ、以下の様に表示されました。

イジュ 伊集院光●KEYは0
アキモ 秋元康●KEYは1
オグリ 小栗旬●KEYは10
オダギ オダギリジョー●KEYは11
カトゥ KAT-TUN●KEYは12
キムラ 木村カエラ●KEYは13
ケツメ ケツメイシ●KEYは14
コイケ 小池徹平●KEYは15
コウダ 倖田來未●KEYは16
コジマ 小島よしお●KEYは17
コブク コブクロ●KEYは18
スピッ スピッツ●KEYは19
エハラ 江原啓之●KEYは2
スマッ SMAP●KEYは20
タチバ 立花隆●KEYは21
タマキ 玉木宏●KEYは22
ナカガ 中川翔子●KEYは23
ニュー NEWS●KEYは24
バクシ 爆笑問題●KEYは25
ハマサ 浜崎あゆみ●KEYは26
バンプ BUMP OF CHICKEN●KEYは27

----------------

ということは、$keyの値でソーティングされてしまっている、ということでしょうか?

ちなみに、このプログラムの直前で、下記の様なプログラムで、ハッシュ化しています。(以下、ソーティングプログラムを含め、全プログラムを記載します)


----------------


$usno=0;
open(IN,"$file") || &error("Open Error : $file");
while (<IN>) {
chomp;
($ptype,$num,$nam,$eml,$url,$id,$date,$host,$title,$yomikata) = split(/<>/);
$id{$usno} = $id;
$title{$usno} = $title;
$yomikata{$usno} = $yomikata;
$yomi1{$usno}= substr($yomikata,0,6);
$usno++;
}
close(IN);


$space = " ";

# ソート処理

foreach $key (sort keys %yomi1) {
print $yomi1{$key}.$space.$title{$key}."●KEYは".$key."<BR>";
;}

print "</body></html>\n";
exit;

お礼日時:2008/05/02 14:05

まずハッシュ(連想配列)の構造を理解しましょう


とりあえずサンプルです

## ハッシュを利用したいならこんな感じ
my $space = ' ';
my %title = ('イジュ'=>'伊集院光',
'アキモ'=>'秋元康',
'オグリ'=>'小栗旬',
'スピッ'=>'スピッツ',
'エハラ'=>'江原啓之',
'スマッ'=>'SMAP',
'ナカガ'=>'中川翔子',
'ニュー'=>'NEWS',
'バクシ'=>'爆笑問題',
'イノウ'=>'井上陽水',
'ヤマダ'=>'山田太一'
);
foreach $yomi (sort keys %title){
print $yomi.$space.$title{$yomi}."<BR>";
}


## どうしても配列ならこんな感じ
my $space = ' ';
my @aDATA = ( 'イジュ 伊集院光',
'アキモ 秋元康',
'オグリ 小栗旬',
'スピッ スピッツ',
'エハラ 江原啓之',
'スマッ SMAP',
'ナカガ 中川翔子',
'ニュー NEWS',
'バクシ 爆笑問題',
'イノウ 井上陽水',
'ヤマダ 山田太一'
);
my @aSORTED = sort @aDATA;
foreach(0..$#aSORTED){
my ($yomi,$title) = split(/ /,$aSORTED[$_]);
print $yomi.$space.$title{$yomi}."<BR>";
}
    • good
    • 0

何度もすいません


前のリストの配列によるサンプル出力の訂正
print $yomi.$space.$title."<BR>";
です。
あわててコピペしてしまいました。
すいません。
    • good
    • 0
この回答へのお礼

ralf124c様の大きなヒント(質問)を元に、ソーティングの直前にあるプログラムを下記のとおりに改造したら、うまくソーティングできました!

----------------

$id{$yomikata} = $id;
$title{$yomikata} = $title;
$yomikata{$yomikata} = $yomikata;
$yomi1{$yomikata}= substr($yomikata,0,6);
$usno++;
}

----------------

また、御丁寧にサンプルプログラムまで提示していただき、ありがとうございます。
今後は、提示していただいた、サンプルプログラムを元に、ハッシュ(連想配列)の構造とソーティングの理解を深めていきたいと思っています。

この度は、ご指導いただき、誠にありがとうございました。
心より感謝致します。

お礼日時:2008/05/02 14:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!