![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
恐れ入ります。
perlにて、&検索を実行する為に、以下のようにしています。
しかしうまく動作しません。
use CGI
$word = $form->param('word');
open (IN<, "xxx.txt");
$rec=<IN>;
$where="$rec ne '' ";
if($word ne ''){
$word =~ s/ / /g;
@word_array = split(/ / , $word);
foreach (@word_array){
$where .= "and $rec=~/$_/ ";
}
}
if($where){
@rec=split(/,/, $rec);
//省略
xxx.txtを$recに格納して、フォームより送信されてきたスペース区切りの語句を、分割し、各々をマッチさせて検索したいのですが、
どのようにしたらよいでしょうか。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> if($where){
これは、$whereという変数が示す値が真か偽か、で判定されます。
このプログラムで$whereに代入されるのは「ただの文字列」です。
if( $where ) が if ($rec ne '' and (略) )になって、neによる比較やandに論理計算がされるわけではありません。
eval関数を使うと、文字列をPerlのプログラムとして解釈して
eval($where) が $rec ne '' and (略) になって、neによる比較やandに論理計算がされます。
ただ、現状は $where="$rec ne '' ";の時点で$recが展開されます
$rec='a b c d'
だと eval($where) は
a b c d ne ''
となり、期待通りの動作をしないでしょう。
一つは、エスケープを使うなどして、 $whereを期待通りの式にするものです。
$where="\$rec ne '' ";
にすれば、$recという文字列がそのまま残るので
eval($where) → $rec ne ''
となります。
ただ
$where .= "and $rec=~/$_/ ";
を
$where .= "and \$rec=~/\$_/ ";
としてしまうと、$_は既に変化しているので期待通りにはならないし、
$where .= "and \$rec=~/$_/ ";
だと、 xxx.txt内の単語が「X/Y」だったりすると
$rec=~/X/Y/
となり文法違反です
もう一つは(こちらを勧めます)
「判定式の文字列」を作るのではなく、判定結果そのものを求めるものです。
ne , andなどは真か偽の値を返します。その値を変数に入れることができます。
$where = ($rec ne '') ;
だと、$recが''なら偽、 $recが''でないなら真が$whereに代入されます。
$where .= "and $rec=~/$_/ ";
を
$where = $where and ($rec=~/$_/ );
にすれば、それまでの$whereと、 ($rec=~/$_/ ) とのandとなります。
if($where)とすれば、$whereの真偽によって分岐します。
あとは
open (IN<, "xxx.txt");
は
open (IN, "<xxx.txt");
か
open (IN,'<', "xxx.txt");
の間違いだとして。
$rec=<IN>;
これは xxx.txt の「最初の1行」を「改行付きで」読みこむことになります。
@rec=split(/,/, $rec);
で、最後の要素には改行文字が付いたままです。
それでよろしいですか?
xxx.txtに日本語等の多バイト文字を使用していませんか?
文字コードによっては、期待通りに動作しないかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- その他(Microsoft Office) Windows Update 後、Office2019(Word、Excelなど)が消えた 4 2023/01/14 10:28
- Word(ワード) パソコン内にあるwordファイルを探したいです。word内に、ある単語が利用されている(書かれている 1 2022/10/11 16:38
- Word(ワード) Wordで作った資料の修正方法 2 2023/06/19 00:51
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
- Word(ワード) マイクロソフト365を購入し、Wordを使用しているのですが、Wordに分割印刷(ポスター印刷)って 2 2023/04/09 18:17
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Word(ワード) 正の文字 4 2022/08/23 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
指定の行数目から行を抽出する
-
Pythonでテキストを行数指定し...
-
<>で区切られたdatファイルをエ...
-
資格試験に向け、ipodで見れる...
-
整形したテキストの行を集計す...
-
Perl アンド検索
-
***.cgiの中身は第三者から見ら...
-
入出力共用が出来ないんです
-
ダイアモンド演算子<>に対するb...
-
タブの色を変更する方法
-
重複ファイル名ある場合ファイ...
-
Perl初心者です。同一データを...
-
perlのflock関数でロックをかけ...
-
Net::FTPを使いファイル一覧の...
-
perlのエディタでおすすめを教...
-
データファイルからのデータの...
-
HTMLのフォームで画像と文...
-
csvで順番の入れ替え
-
レコードの書込み判断
-
Perlでファイルを読み込みタグ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Pythonでegrep機能をつかいたい
-
Fortranで1行飛ばして読み込む方法
-
C++でのテキストファイル読み込...
-
C言語初心者です。プログラミン...
-
テキストファイルの各行を配列...
-
ファイルの内容をスカラー変数...
-
shellのコマンド deffの差分の...
-
<>で区切られたdatファイルをエ...
-
perlの引数で複数のファイル処...
-
ifstream/ofstream について
-
Pythonでテキストを行数指定し...
-
「パスが見つかりません」とい...
-
Perl エラーログを指定の場所...
-
perlでCSVをソートする方法につ...
-
文字列操作に関する質問です。
-
perlでIEのクッキーを削除したい
-
連番のファイルを何個も開きたい
-
ファイル名に日付を入れてアッ...
-
一行だけ読込
おすすめ情報