
No.5ベストアンサー
- 回答日時:
No.4のコメント、訂正です
# $bufにファイルの中身を全部入れる
↓
# $logにファイルの中身を全部入れる
それからNo.2/3さん、やはり混乱されているからでしょうか。
差し出がましいようですが、訂正が入らないと質問者さんが困惑されると思いましたので……。
> # ログの数を取得します(修正部)
> $log=split(/\n/,@log);
前で
> @log=<IN>;
とされてますので、行数は $#log + 1 で得られます。
また現状では $log にはログ行数とは違う値が入ってしまってます。
さらに、
> foreach(@log) {
> for(1..$log){
> $word="$log[$i]";
2重ループにする必要が無く、
foreach(@log) {
$word=$_;
か、
for(0..$#log){
$word="$log[$i]";
でいいと思います。
No.6
- 回答日時:
laundryload様、ご指摘ありがとうございます
確かめてみたところ確かに $log=split(/\n/,@log);は『1』でした(><)
それに
a文字列a<>ipアドレスa<>kk
文字列aa<>ipアドレスa<>kk
文字列a<>aipアドレスa<>kk
文字列a<>ipアドレスaa<>kk
とすると
文字列a<>ipアドレスaa<>kk
が一致するになってしまいました
ですのでまた修正してみました
open(IN,"./log.dat");
@log=<IN>;
close(IN);
$log= $#log;
for(0..$log){
@l=split(/<>/,"$log[$j]");
$word="$l[0]";
if($word=~ /^文字列a$/) {
$word="$l[1]";
if($word=~/^ipアドレスa$/) {
print "一致するもの:$log[$i]<br>\n";
}else{
print "一致しないもの:$log[$i]<br>\n";
}
}
$i++;
}
文字列a<>ipアドレスa<>kkのような形ではなく、質問のように 文字列a<>ipアドレスa だけであるなら
for(0..$log){
$word="$log[$i]";
if($word=~ /^文字列a<>ipアドレスa$/) {
print "一致するもの:$log[$i]<br>\n";
}else{
print "一致しないもの:$log[$i]<br>\n";
}
}
$i++;
}
です
No.4
- 回答日時:
以下のコードは見やすくするためスペースに全角スペースを使ってますから、コピーするなら注意してください。
(1) やたら大きなログでないのなら
$f='./logdat';
open(IN, $f);
read(IN, $log, -s $f); # $bufにファイルの中身を全部入れる
close(IN);
$word = "文字列b<>ipアドレスb";
if($log =~ /$word/s){ # $bufの中身を一行とみなして$wordでサーチ
### 処理 ###
}
(2)ログの行数が相当多くなりそうなとき
open(IN, './logdat');
@l=<IN>;
close(IN);
$word = "文字列b<>ipアドレスb";
$exist = 0; # 最初 $exist は FALSE
foreach(@l){
if(/$word/){
$exist = 1; # 見つかったら $exist を TRUE に
last;
}
}
if($exist){
### 処理 ###
}
ただひとつ申しますと、質問に沿ってこのように書いてますが今のままだと、$wordとして"文字列b<>ipアドレスb"を選んだ場合
"aaa文字列b<>ipアドレスb"
や
"文字列b<>ipアドレスbxxx"
も一致してしまいます。
これが質問者さんの意図と違うのであれば、以下のように変えるのがいいのかな、と思います。
(1)
$f = './logdat';
open(IN, $f);
read(IN, $log, -s $f);
close(IN);
$log = "\n" . $log . "\n"; # 先頭と末尾に改行を追加
$word = "文字列b<>ipアドレスb";
if($log =~ /\n$word\n/s){ # $wordを改行で挟んでサーチ
### 処理 ###
}
(2)
open(IN, './logdat');
@l=<IN>;
close(IN);
$word = "文字列b<>ipアドレスb";
$exist = 0;
foreach(@l){
if(/^$word$/){ "^"は行頭にマッチ、"$"は行末にマッチ
$exist = 1;
last;
}
}
if($exist){
### 処理 ###
}
No.3
- 回答日時:
こんにちは
ちょっと頭がこんがらがってますが・・・どちらが欲しいのでしょう?
一致したとき => if($word =~/ /) { }
一致しないとき => if($word !~/ /) { }
$wordの後ろは半角スペース空けてくださいね(^^)
≪例として≫(ちょっと修正してます(--;)
log.datに
文字列a<>ipアドレスa<>ad
文字列b<>ipアドレスb<>id
文字列c<>ipアドレスc<>cd
文字列a<>ipアドレスb<>ad
文字列b<>ipアドレスa<>id
とあるとします
open(IN,"./log.dat");
@log=<IN>;
close(IN);
# ログの数を取得します(修正部)
$log=split(/\n/,@log);
# 一致したときと一致しないときを一緒に処理します
foreach(@log) {
for(1..$log){
$word="$log[$i]";
if($word=~ /^文字列a<>ipアドレスa/) {
print "一致するもの:$log[$i]<br>\n";
}else{
print "一致しないもの:$log[$i]<br>\n";
}
$i++;
}
}
print "<p>\n";
# 一致したときのみの処理です
foreach(@log) {
for(1..$log){
$word="$log[$j]";
if($word =~ /^文字列a<>ipアドレスa/) {
print "一致したもの:$log[$j]<br>\n";
}
$j++;
}
}
print "<p>\n";
# 一致しないときの処理です
foreach(@log) {
for(1..$log){
$word="$log[$k]";
if($word !~ /^文字列a<>ipアドレスa/) {
print "一致しなかったもの:$log[$k]<br>\n";
}
$k++;
}
}
表示結果は
一致するもの:文字列a<>ipアドレスa<>ad
一致しないもの:文字列b<>ipアドレスb<>id
一致しないもの:文字列c<>ipアドレスc<>cd
一致しないもの:文字列a<>ipアドレスb<>ad
一致しないもの:文字列b<>ipアドレスa<>id
一致したもの:文字列a<>ipアドレスa<>ad
一致しなかったもの:文字列b<>ipアドレスb<>id
一致しなかったもの:文字列c<>ipアドレスc<>cd
一致しなかったもの:文字列a<>ipアドレスb<>ad
一致しなかったもの:文字列b<>ipアドレスa<>id
となります
参考URL:http://www.kent-web.com/perl/chap7.html
No.2
- 回答日時:
open(IN,"./log.dat");
@log=<IN>;
close(IN);
$log=@log; # log数を取得(繰り返す回数)
foreach(@log) {
for(1..$log){ #繰り返す回数を指定
$word="$log[$i]"; # logを1行ずつ見ます
if($word=~ /文字列c<>ipアドレスc/) { # パターンがあるか調べてます
print "$log[$i]\n"; # logをHTML書き出してます
}
$i++;
}
}
#以降は説明ですのであっても機能しますが邪魔なら削除してください
ちなみにif ($word !~ /パターン/) は一致しなかったときの処理で
$word="パターンを調べるもの(この場合ログ内容)"; です
この回答への補足
首を寝違えて痛めてしまったため、パソコンを使うことができませんでした。御礼が遅れてしまい申し訳ございませんでした。お手数ですが、引き続き宜しくお願いいたします。
補足日時:2007/02/27 00:48回答有難うございます。
申し訳ありません、質問の仕方が間違えていました。
./log.dat内に「文字列b<>ipアドレスb」の文字列が含まれていた場合に{処理}を行いたいと考えています。
教えていただいた方法で「if($word=~ 」この部分を「if($word!~」にして試してみましたが、処理が実行されませんでした。お手数ですが、宜しくお願いいたします。
No.1
- 回答日時:
特定の文字列を含む行に対して処理を施したいということなのかな、と読み取りました。
こんな感じでどうでしょう。
open(IN, './logdat');
@l=<IN>;
close(IN);
$word = "文字列b<>ipアドレスb";
foreach(@l){
if(/$word/){
### 処理 ###
}
}
参考URL:http://www.tohoho-web.com/wwwperl.htm
この回答への補足
首を寝違えて痛めてしまったため、パソコンを使うことができませんでした。御礼が遅れてしまい申し訳ございませんでした。お手数ですが、引き続き宜しくお願いいたします。
補足日時:2007/02/27 00:48回答有難うございます。
申し訳ありません、質問の仕方が間違えていました。
./log.dat内に「文字列b<>ipアドレスb」の文字列が含まれていた場合に{処理}を行いたいと考えています。宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ハッキング・フィッシング詐欺 自分のIPアドレスをGoogle検索しようとしたら「数字の羅列(IPアドレス)を装ってあなたの情報を 2 2022/04/08 18:36
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(コンピューター・テクノロジー) googleスプレッドシートでカッコ内の文字数をカウントしたい 1 2023/01/17 15:52
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) 現在のセルの文字列を右隣のセルの名前にするマクロをつくりたい 4 2023/01/12 09:01
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- 固定IP iPhoneでのIPv4切り替え方法 3 2022/11/24 22:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カートの送料設定を2個まで1個...
-
直前のワードとの間にスペース...
-
正規表現による検索
-
10進数を表す文字列を整数型に
-
perlを使用しての特定行抽出に...
-
以下のperlのプログラムについて
-
Malformed UTF-8 character
-
splitの逆の処理
-
文字列にコントロール文字を含...
-
Perlで入力項目の英数字を全て...
-
CSVファイルの中で、「 , 」カ...
-
住宅にカナを入力する際に丁目...
-
エクセルで数値を全角文字(カ...
-
IEからEdgeへの移行に伴うIMEの...
-
マッチングアプリで新しくアカ...
-
文字コードの%E3%80%とは何です...
-
あるユニコード文字が、あるコ...
-
JISとシフトJIS
-
VBA 文字に半角が含まれて...
-
封筒の宛先で縦書きの書き方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Malformed UTF-8 character
-
文字列と数字を含むセルから数...
-
Perlで Right関数に近い処理を...
-
パイソンエラーについて
-
ワイルドカード処理
-
何度も出現する文字列AAのうち...
-
GDBでデバッグするとき文字列の...
-
splitの逆の処理
-
数字を文字列に変換し短縮化する
-
リストデータの検索でのエラー...
-
メールヘッダのMIMEエンコード...
-
プログラミング HSPの変数につ...
-
Perlでのの抜き出し方法
-
perlで文字列を短く(圧縮)し...
-
正規表現での文字の抜き出し
-
perlでの判定がうまくいきません
-
VBA like演算子について
-
リフェラーで弾く方法について
-
文字列検索(例えばindex関数)...
-
Perl(Windows)の文法について
おすすめ情報