質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

3回答

597閲覧

特定の文字列を含むファイルを検索しようとしてもうまくいかない。

trm

総合スコア117

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2018/02/21 03:24

前のcgiより変数syouhinkensakuを受け取り、特定の文字列を含むファイルを検索しようとしてもうまく行きません。どこが悪いのかご指摘の程よろしくお願い致します。

#use strict; use warnings; use utf8; use CGI; my $query = new CGI; use CGI qw(:standard); use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #use DBI; #use DBD::SQLite; #追加use #use utf8; #use CGI; #$query = new CGI; #use CGI qw(:standard); #use File::Copy; #binmode STDIN, ':utf8'; #binmode STDOUT, ':utf8'; #binmode STDERR, ':utf8'; #use strict; #use warnings; #追加use終了 #binmode STDIN, ':encoding(cp932)'; #binmode STDOUT, ':encoding(cp932)'; #binmode STDERR, ':encoding(cp932)'; $syouhinkensaku = $query->param('syouhinkensaku'); $dir = "syouhin"; chdir $dir or die "Cannot change working directory $dir: $!"; @file = glob "*"; #@syouhinfile=join(",", @file)"\n"; @syouhinfile=join(",", @file); #$abc = "kensakuitiji.txt"; #open(OUT, ">> $abc") || die("ファイルを追記モードで開けませんでした"); #$msg2 = "@file\n"; #print OUT $msg2; #close(OUT); $i=0; $h=0; @sub2; if($syouhinkensaku ne ""){ while($i!=-1){ $i=index(@syouhinfile,$syouhinkensaku,$h); $j=$i; while(1){ $sub = substr(@syouhinfile,$i, 1); if($sub eq ","){ last; $i=$i-1; } } $i=$i+1; while(1){ $sub = substr(@syouhinfile,$j, 1); if($sub eq ","){ last; $j=$j+1; } } $j=$j-1; $k=$j-$i-1; $l=$l+1; $sub2[$l] = substr(@syouhinfile,$i,$k); $h=$i+1; #$i=-1; } } print "Content-type: text/html\n\n"; print<<"HTML"; <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>検索ヒット</title> </head> <body bgcolor="#000066" text="#ff0000" link="#0000ee" alink="#0000ee" vlink="#551a8b"> <form action="b5.cgi"> <form> @syouhinfile<br> for($m=1;$m=$l;$m++){ $sub2[$m]<br> } <input type="submit" onclick="location.href'b5.cgi'" value="NEXT"><input type="reset" value="RESET"> </form> <br> <br> </body> </html> HTML exit;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

この問題は解決されました。

投稿2018/02/28 23:22

trm

総合スコア117

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、joinした結果を配列(@syouhin)に入れたり、配列をsubstrしたりするのはおかしいのでやめましょう。

スクリプトの先頭にはuse strictをつけることを強く勧めます。このばあいすべての変数定義をmy @xのようにしなければならないので面倒に感じるでしょうが、これによって少なくとも変数名のスペルミスによるおかしなバグを防ぐことができます。

文字化け: 当該perlスクリプトが仮に正しいとしても、送られてくるものが想定と違うものであれば結果もおかしなものになります。両方正しいとしても画面出力の段階で設定が間違っていればやはり「文字化け」します。どの段階に問題があるのかはすべてを知っているあなたにしか確認できません。ただ「うまくいきません」だけの質問を何十回繰り返されても問題は解決できません。いいかげん質問の仕方を学びましょう。

追記:
まず上述のsubstr周りについて。 これはリストコンテキストとスカラーコンテキストの混同ということになります。スカラーが求められるところに配列を置くと、配列はスカラーに変換されます。このとき、どういう風に変換するかというと、「配列の個数」をもってその値とするのです。すなわち、substr(@syouhinfile,...は、実際にはsubstr("5",... とかになります。その"5"を分解して一部を取り出そうというわけです。おそらくtrm氏のやりたいこととは違うでしょう。

そもそも、if($syouhinkensaku ne ""){以下のブロックは謎すぎます。文字列をカンマで分割しようとしているように見えますが、その大本は上の方で配列の中身を一生懸命カンマで繋いだ(つなごうとしている)ものです。繋いだり分割したり、いったい何をしたいんだろう。

他にも、このスクリプトは至る所あっちもこっちもおかしいところだらけです。質問者のこれまでの質問ぶりを見ると、いきなりcgiに手を出すのは無謀の上にも無謀と言わざるを得ません。

もっと部分部分をしっかり把握してコードが組めるように、コマンドラインで小さなコードを書く練習を積むべきです。さもないと、この調子では10年たっても同じことの繰り返しでしょうねえ。

投稿2018/02/21 04:04

編集2018/02/21 18:50
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://teratail.com/questions/111536
文字化けしてたら検索できないので、とりあえず文字化けを直してから質問した方がいいと思います。

投稿2018/02/21 03:30

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trm

2018/02/21 05:23

半角英数字は文字化けしないので、それを使って検索しています。とりあえずは文字化けの問題は、多分相当にややこしいことが原因である気がしますので、実際にスクリプトを動かさず、想定でコード記述を進めていきたいと思います。
Zuishin

2018/02/21 05:25

茨の道を歩みたいなら止めません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問