
シュワルツ変換の不具合で困っています。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1959574
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190
で質問したものです。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
&hoge;
sub hoge{
open(o,"hoge.txt");
@all = <o>;
close(o);
for (@all){
($sentence,$filename) = split(/,/,$_);
$score++;
push @hoge, ($score,$_,"<br>\n");
}
@hoge = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /,/]}@hoge;
print @hoge;
}
というcgiを作成し、実行してみたのですが望んだ処理が出来ません。
hoge.txtは
,123,abc.txt
,456,def.txt
,789,ghi.txt
,123,jkl.txt
,456,mno.txt
,789,pqr.txt
という内容です。
cgiを実行すると
6 5 4 3 2 1 ,789,pqr.txt
,456,mno.txt
,123,jkl.txt
,789,ghi.txt
,456,def.txt
,123,abc.txt
となってしまいスコアが先頭に集まってしまいます。
シュワルツ変換の行を削除すると
6,789,pqr.txt
5,456,mno.txt
4,123,jkl.txt
3,789,ghi.txt
2,456,def.txt
1,123,abc.txt
こうなるのですが、これをシュワルツ変換を用いて
1,123,abc.txt
2,456,def.txt
3,789,ghi.txt
4,123,jkl.txt
5,456,mno.txt
6,789,pqr.txt
と出力させたいのです。
どこをどのように変えればよいでしょうか。
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
チェックすべき点が2つあります。
push @hoge ... の結果、@hogeにはどういうデータが入っていますか?
期待通りのデータ構造では入っていないはずです。
最初のmapを適用した結果はどういうデータ構造になっているか把握していますか?
こういうときは、標準モジュールの Data::Dumper を使って、データ構造をチェックしましょう。
また、オープンするファイルハンドルに小文字のbarewrodを使うのは習慣として勧められません。大文字を使うか、例に挙げたようにmy変数を使いましょう。
ただし古いバージョンのPerlだと使えませんが。
それと、読み込んだデータを2度splitしていますが、一度目のsplitの
結果である $sentenceと$filenameを使っていないようですがなぜでしょう?
#!/usr/local/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
&hoge;
sub hoge{
my @all = <DATA>;
my @hoge;
my $score;
for (@all){
my $sentence;
my $filename;
($sentence, $filename) = split /,/, $_;
$score++;
#push @hoge, ($score, $_, "<br>\n");
push @hoge, [$score, $_, "<br>\n"];
}
#print join ':::', @hoge;
#print "#####\n";
#use Data::Dumper;
#my @mapped = map {[$_, split /,/, $_->[1]] } @hoge;
#print Dumper(@mapped);
# @hoge = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /,/]}@hoge;
my @sorted = map { $_->[0] }
sort { $b->[2] <=> $a->[2]}
map {[$_, split /,/, $_->[1]] } @hoge;
#print Dumper(@sorted);
foreach my $item (@sorted) {
print join(':', @{$item}), "\n";
}
}
__END__
,123,abc.txt
,456,def.txt
,789,ghi.txt
,123,jkl.txt
,456,mno.txt
,789,pqr.txt
データ構造までは把握していませんでした。
習慣やDumper等も含めて、もう一度丁寧にPerlを学ぼうと思います。
splitはこのcgiに今後コードを追加しようと思っているのですが、消し忘れてしまったものです。
ご回答ありがとうございました。
No.4
- 回答日時:
補足です。
pushした順に番号をつけて出力すればいいのなら、
pushではなくunshiftで配列に追加するか、
foreachでとりだすときにreverseしてやれば良くて、
わざわざ重いソートなんてやる必要ないのでは。
この回答への補足
おっしゃる通りなのですがこのあと色々コードを追加して処理するので
質問に シュワルツ変換を用いて
と付け加えさせていただきました。
No.3
- 回答日時:
興味があったもので…
私も #2 の方が回答されてるように @hoge の中身が怪しいかと…
push @hoge, ($score,$_,"<br>\n");
これでは
$hoge[0] = "1";
$hoge[1] = ",123,abc.txt\n";
$hoge[2] = "<br>\n";
$hoge[3] = "2";
$hoge[4] = ",456,def.txt\n";
$hoge[5] = "<br>\n";
という風に値が入ってしまいますが…
下記のような形を望んでいるのでは?
$hoge[0] = "1,123,abc.txt\n,<br>\n";
$hoge[1] = "2,456,def.txt\n,<br>\n";
こうした上で配列 @hoge の第一項($score)でソートすれば
@hoge = map {$_->[0]} sort {$a->[1] <=> $b->[1]} map {[$_, split /,/]}@hoge;
これで期待通りの結果が得られるのでは…
てっきり
push @hoge, ($score,$_,"<br>\n");
とすれば
$hoge[0] = "1,123,abc.txt\n,<br>\n";
$hoge[1] = "2,456,def.txt\n,<br>\n";
となるものだと思っていました。
これじゃあ上手くできませんよね。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
openした後、closeしないでプロ...
-
Perlのエラーについてご教授く...
-
テキストファイルで提出とは?
-
Perlプログラムについてファイ...
-
perlで複数のファイルの処理に...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「パスが見つかりません」とい...
-
ファイル名を複数個配列で確保...
-
シェル(ksh)でテキスト文書を変換
-
Perlで文字列の操作がしたい
-
ディスク残量が無くなってしま...
-
繰り返しファイルをアップロー...
-
Fortranで1行飛ばして読み込む方法
-
どこがおかしいですか?教えて...
-
どなたか教えて下さい。
-
スマートに euc ページを sjis ...
-
絶対+相対アドレスから絶対ア...
-
perl の挙動について
-
シュワルツ変換の不具合
-
2行の文章を1行にまとめる
-
資格試験に向け、ipodで見れる...
-
excel 2003から VBAのreplaceマ...
-
シェルスクリプトについて
-
Perl エラーログを指定の場所...
-
VBScriptにて、テキストファイ...
-
dataファイルの特定の行から特...
おすすめ情報