ログを複数同時に削除する方法について

このQ&Aのポイント
  • Perlでログを複数同時に削除する方法がわかりません。ログファイル「log.txt」に保存されているデータに対して、フォームのチェックボックスから送信された値とマッチする行を削除したいと考えています。
  • 現在はラジオボタンとforeachループを使用して1行だけ削除できるようにしていますが、複数行を同時に削除するための方法が分かりません。現在試している方法では、1つ目のチェックボックスに対してマッチした場合でも、2つ目のチェックボックスにはマッチしないため、望んだ結果が得られません。
  • もし他の方法があるのであれば、詳しい方のアドバイスをいただきたいです。お願いします!
回答を見る
  • ベストアンサー

ログを複数同時に削除

こんにちは。 Perlでログを複数同時に削除する方法が分かりません。 ログファイル「log.txt」に Num=1234<>タイトル=あいうえお Num=1235<>タイトル=かきくけこ Num=1236<>タイトル=さしすせそ Num=1237<>タイトル=さしすせそ のようなデータが入っていて フォームのチェックボックス(name=delck)から送られてきた値と マッチするデータを削除したいと思っています。 例:1234と1236 最初はラジオボタンにして1行だけ削除できるようにしたのですが やはり複数同時に削除できた方が便利なので 試しているのですが、どう書けば良いのかわからない状態です。 複数の値が送られてきた場合は @delckに入るようになっています。($delck[0]が1234、$delck[2]が1236) ログの各行を、delckの数だけチェックすれば良いのかなと思って わからないなりに↓こんな感じで、 foreachの中にforeachを入れたりしてみたのですが foreach $data (@log){ foreach $del (@delck){ $ck = "Num=$del<>"; if($data =~ /$del/){$match = 1;} else{push(@newdata,$data);} } } これだと1個目のdelckにマッチしても、2個目のdelckにはマッチしないから結局@newdataに入ってしまうようで 思った通りの動作をしてくれませんでした。 他の書き方をしてみても、結局発想は↑と同じになってしまって 結果は同じになってしまいます。 どなたか詳しい方、アドバイスいただけると助かります! よろしくお願いします。

  • RH01
  • お礼率92% (86/93)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

#!/usr/bin/perl use warnings; use strict; my @logs = <DATA>; my @dels = qw(1234 1236); my @new_logs = (); foreach my $log (@logs) { my $del_match = 0; DEL_CHK: foreach my $del (@dels) { if ( $log =~ /Num=$del<>/ ) { $del_match = 1; last DEL_CHK; } } push @new_logs, $log if $del_match == 0; } print foreach @new_logs; __DATA__ Num=1234<>title=111 Num=1235<>title=222 Num=1236<>title=333 Num=1237<>title=444 Num=1238<>title=555 --- Num=1235<>title=222 Num=1237<>title=444 Num=1238<>title=555

RH01
質問者

お礼

早速アドバイスありがとうございます。 この部分だけでとりあえずテストしてみたら上手くいきました! やり方自体というよりは、$del_matchなどをうまく使わないといけなかったんですね。。大変勉強になりました。 どうもありがとうございました。

関連するQ&A

  • php+mysqlで複数選択削除について

    php+mysqlで複数選択削除について いつもお世話になっておりますm(_ _)m 今回の質問なんですが チェックボックスで複数選択したものを一括で削除したいのですが、検索しても見つからないので質問しました!! 例) // $_POST["id"] ← チェックボックスより選択されたデータ // test ← テーブル名 foreach($_POST["id"] as $del){ delete test where id = $del; } 簡単にですいません;; 普通は上記のようにループさせながら削除すると思うのですが、ループさせないで一括で削除したいのですが可能でしょうか? 下記の様にカンマ区切りで一括削除は可能でしょうか? $sql = "delete test where "; foreach($_POST["id"] as $del){ $sql .= "id = $del, "; } クエリ発行

    • ベストアンサー
    • MySQL
  • 複数選択した場合のチェックボックスの受け渡しについて!

    こんばんわっ! 度々質問させていただいてます。 今回、Mysqlより日記のデータの抽出を行いました。 書いたり更新したり削除したりと言う日記です。 書いたり更新したりは無事出来ました。問題は削除です。 セレクトフォーム形式の場合削除できました。 しかしセレクトフォーム形式の場合一個づつの削除になります。 これじゃあんまりだなぁ・・・と思い。 非常に悩みました。 チェックボックス形式にしようと思いましたっ! 抽出結果に↓をループしました。 <input name="checkbox[]" type="checkbox" value="<?=$id?>" /> 表示結果は↓です。 □太郎さんの5月1日の日記 タイトル;ホニャララ □太郎さんの5月2日の日記 タイトル;ホニャララ チェックした日記を削除する。 の様になります。(□はチェックボックスです) 値の受け渡しはこちらです↓ $result =$_POST['checkbox']; foreach($result as $id) 今回チェックボックス形式の削除は初めてです。 チェックボックスにあるname=checkbox[] と vulue の理解できてません(*∩_∩*) 一つの項目は受け渡せました。 しかし複数チェックを行っていても複数の値を受け渡す事出来ません。 vulue= に問題ありますか! 又は値を受け取る $result =$_POST['checkbox'];  foreach($result as $id) にもんだいありますかっ!

    • ベストアンサー
    • PHP
  • "excel"もしくは"秀丸"で削除したいデータを同時に複数のデータを

    "excel"もしくは"秀丸"で削除したいデータを同時に複数のデータを選択指定して削除したいのですが、、 よくわかりません。おしえていただけますでしょうか、、 例を下に記入いたします。 =================== 例) 【元のデータ】 aa bb cc dd ee ff gg 削除したいデータ:"aa"と"dd" *この2つを同時に選択指定して削除希望です。 【削除後のデータ】 bb cc ee ff gg =================== もし、エクセルもしくは秀丸で仮に方法が無い場合、他のツールを使用した方法でも 嬉しいです。 よろしくお願いいたします!!

  • リストの削除について

    以下のようなプログラムを作ったのですが、このプログラムに削除をする関数を加えたいです。 たとえば削除する値2と入力した場合 1 3 7 8 9 15 19 20と表示させたいのですがどのように行えばよいでしょうか? 自分が作った削除の関数だとうまくできませんでした。どうしたらよいのでしょうか? よろしくお願いします。 #include<stdio.h> #define NUM 12 typedef struct{ int IntData; int NextIndex; } MyList; void ShowList(MyList data[]); int DeleteALL(int value,MyList data[]); int main(void) { int i; int datano=NUM; int dt[NUM]={1,2,2,3,2,7,8,9,15,19,20,2}; int del=0,temp=0,del=0; char sentaku[3]; MyList data[NUM]; for(i=0;i<datano;i++){ data[i].IntData=dt[i]; data[i].NextIndex=i+1; } data[NUM-1].NextIndex=-1; ShowList(data); while(1){ printf("選択(削除=v, 編集終了=q):"); scanf("%s",sentaku); if(sentaku[0]=='v'){ printf("削除する値:"); scanf("%d",&del); temp=DeleteALL(del,data) printf("%d つのノードを削除しました\n",temp); ShowList(data); } else if(sentaku[0]=='q'){ return 0; } else{puts("もう一度入力");} } } void ShowList(MyList data[])//表示する関数 { int i=0; printf("リスト: "); while(i!=-1){ printf("%d ",data[i].IntData); i=data[i].NextIndex; } printf("\n"); } /* 以下自分が作った削除の関数 */ int DeleteALL(int value,MyList data[]) { int i=0,dn=0,count=1; while(data[i].NextIndex!=-1){ i=data[i].NextIndex; dn++; } for(i=0;i<dn;i++){ if(value==data[i].IntData){ count++; data[i-1].NextIndex=data[i].NextIndex; data[i].NextIndex=-1; } return count; }

  • PHP:preg_match_allで複数条件指定

    preg_match_allで複数条件を設定する方法についてお尋ねします。 環境 PHP:5.1.6 MySQL:5.0.77 --------ソース例------------------------------------------ <a href="1000/23">1: 【国語】接続後について (授業1) (20)</a> <a href="1000/26">2: 【数学】分数 (206)</a> --------------------------------------------------------- 上記のようなHTMLソースを分解してMySQLに登録することを考えています。 (1行目) 1000/23 | 1 | 【国語】接続後について (授業1) | 20 (2行目) 1000/26 | 2 | 【数学】分数 | 206 という形に a hrefの中身 |スレッド番号 | タイトル | コメント数 4つに分解してMySQLに登録します。 正規表現を学んで、個別にデータを取り出すことはできました。 以下に作成したソースを記載します。 $contents='<a href="1000/23">1: 【国語】接続後について (授業1) (20)</a><a href="1000/26">2: 【数学】分数 (206)</a>'; preg_match_all( '/<a href="(.*?)">/su', $contents, $match ); foreach ( $match[ 1 ] as $var ) { echo htmlspecialchars($var)."<br>"; } preg_match_all( '/">([0-9]*?):/su', $contents, $match2 ); foreach ( $match2[ 1 ] as $var2 ) { echo htmlspecialchars($var2)."■<br>"; } preg_match_all( '/[0-9]: (.*?)\([0-9]*\)<\/a>/su', $contents, $match3 ); foreach ( $match3[ 1 ] as $var3 ) { echo htmlspecialchars($var3)."■<br>"; } preg_match_all( '/\(([0-9]*?)\)</su', $contents, $match4 ); foreach ( $match4[ 1 ] as $var4 ) { echo htmlspecialchars($var4)."●<br>"; } 【実行結果】 1000/23 1000/26 1 2 【国語】接続後について (授業1) 【数学】分数 20 206 1行ずつMySQLに登録したいので preg_match_all( '/条件1,条件2,条件3,条件4/su', $contents, $match ); のような形で指定して個々の値を下記の変数に入れることは可能でしょうか? ループ処理開始{ $url $num $title $res //MySQLに接続 //データ登録 }

    • ベストアンサー
    • PHP
  • PHPの勉強として掲示板を作成しているのですが、謎の二重書き込みに出会

    PHPの勉強として掲示板を作成しているのですが、謎の二重書き込みに出会い躓いています。 下記はテストとして書いた、状況が再現されるソースです。 <?php $filename = './test.dat'; if($_REQUEST) { $data = file($filename); $newdata = "{$_REQUEST['newdata']}\n"; $logfile = @fopen($filename, "r+"); flock($logfile, LOCK_EX); foreach($data as $value) { fputs($logfile, $value); } fputs($logfile, $newdata); flock($logfile, LOCK_UN); fclose($logfile); } ?> <html> <head><title>TEST</title></head> <body> <form action="test.php"> <input type="text" name="newdata"> <input type="submit"> </form> </body> </html> 5、6行目で $newdata = "{$_REQUEST['newdata']}\n"; $data[] = $newdata; とした場合、DATを逆順にして $newdata = $_REQUEST['newdata']; $array_unshift = $newdata; とした場合、また、そこで追加せずに書き込み処理を $logfile = @fopen($filename, "r+"); while(!feof($logfile)) { $data[] = fgets($logfile); } fputs($logfile,$newdata); foreach($data as $value) { fputs($logfile, $value); } とした場合、など…どうやってもなぜか同じ症状が出ます。 しかももっと不思議なのは、どこでおかしくなっているのか調べようと思い途中にprint_r($data)を入れると、場所によってはなぜか二重書き込みが起きなかったりするのです。 検索しても同じ状況は見つけられずどうしたものかと悩んでおります。 情報が足りないかもしれませんが、何か気づいた方がいましたら教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 削除ボタンを押すとperlにてデータを削除するようにしたいんですができません。

    フォーム.html(一部) <form name="form1" method="post" action="admin.cgi"> <input type="hidden" name="mode" value="edit3"> <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><b>クライアント(ロードサイド)</b> <input type="hidden" name="group" value="1"> <br> ※前のページへ戻る場合には、ブラウザの戻るボタンでお戻りください。</td> </tr> </table> <br> <table width="740" border="1" cellspacing="0" cellpadding="10" align="center" bordercolor="#333333"> <tr> <td bgcolor="#FFEEEE">このデータを削除する場合には、下の削除ボタンをクリックしてください。<br> ※この作業は取り消しができませんので、よく確認してから削除ボタンをクリックしてください。<br> <br> <input type="button" value="物件NO: _%data_num%_ を削除する" onClick="location.href='admin.cgi?mode=del&group=_%group%_&data_num=_%data_num%_'"> <br> この「物件NO: 」のボタンを押すとadmin.cgiに飛び データファイル内のデータを空にします。 ----------------admin.cgi---------------------------------- if($param{'mode'} eq 'del'){ ##===================================== ## 物件データをオープン = ##===================================== if($param{'group'} eq '1'){ $datafile = $datafile1;} elsif($param{'group'} eq '2'){ $datafile = $datafile2;} elsif($param{'group'} eq '3'){ $datafile = $datafile3;} if(!stdio::lock($lock)){ error('システムエラー','只今混み合っております.'); } # ロック if(!open(DATA,"+<$datafile")){ stdio::unlock($lock); &error('システムエラー',"ファイル ( $datafile ) をオープンできませんでした。"); } @data = <DATA>; foreach(@data){ @data2 = split(/,/); if($data2[0] eq $param{'data_num'}){ $_ = ''; last; } elsif($data2[0] eq $param{'data_num2'}){ $_ = ''; last; } } seek(DATA,0,0); print DATA @data; truncate(DATA,tell(DATA)); close(DATA); stdio::unlock($lock); ##===================================== ## テンプレートオープン = ##===================================== if(!open(HTML,$html_finish)){ &error('システムエラー',"ファイル ( $html_finish ) をオープンできません。"); } @html = <HTML>; close(HTML); ##===================================== ## HTML出力 = ##===================================== print <<"EOF"; Content-type: text/html @html EOF exit; } # モード del ここまで ----------------------------------------------------- この「data_num2」の削除には成功するんですが 「data_num」の場合はボタンを押しても何も起こりません。 恐らく「data_num」のif文に行っていないのだと思うんですが、 何が原因か分かりません。 情報が少ないかもしれませんが 解決の糸口をお願いします。 データはcsv形式のファイルです。

    • ベストアンサー
    • HTML
  • 削除確認のアラートを出したい

    お疲れ様です。 お世話になっております。 過去ログでもいくつか出てることは承知の上で、質問させていただきます。 フォームの流れとしては、 チェックボックスで削除したい項目にチェック(仮に1番と7番をチェック) 削除ボタンを押す 下記のデータを削除します。よろしいですか? 1番 7番 OKを押すと削除 キャンセルを押すと戻る。 です。 POSTされた内容をアラート画面に表示させたいです。 JSはさっぱり手をつけたことがないので、POSTの受け取り方がわからないのですが、 過去ログを見ながら書いてみると、 <<JS>> func chk_del{ return window.confirm('これらの情報を削除します。よろしいですか? + POSTのデータ表示'); } <<html>> <form method="post" action="delete.php" onsubmit="return chk_del();"> <input type="checkbox" id=1>1番.... ....<input type="checkbox" id=7>7番 <input type="submit" value="削除" name="delete"> </form> これだと今のところまだconfirmが出ずにデリートされてしまうのですが、このような流れです。 恐れ入ります。どのように記述すればいいか教えていただけませんでしょうか。

  • 返信記事付きログファイルの表示

    以下のような掲示板のログファイルがあります。 2<>2への返信記事2つ目<><> 1<>1への返信記事4つ目<><> 1<>1への返信記事3つ目<><> 2<>2への返信記事<><> 1<>1への返信記事2つ目<><> 1<>1への返信記事<><> 2<>親記事<>2.jpg<> 1<>親記事<>1.jpg<> 親記事もレス記事も同じログファイルに下から投稿順に記録されていきます。 親記事には必ず画像が付きます。 これを表示するだけの、ごく単純なCGIを作っているのですが、親記事も返信記事も独立して表示されてしまいます。 #!/usr/local/bin/perl require './jcode.pl'; $log = "./log.txt"; $title = 'test'; print "Content-type: text/html; charset=euc-jp\n\n"; print <<EOM; <html> <head> <title>$title</title> </head> <body> EOM open(OUT,"$log"); @DATA = <OUT>; close(OUT); foreach(@DATA){ ($num,$body,$img) = split(/<>/,$_); if($img ne ""){ $img = "<p><img src=\"$img\"></p>"; } print <<EOM; <h1>$num</h1> <p>$body</p> $img <p>$res</p><hr> EOM } どうすれば親記事番号と返信記事番号を関連付けて、$bodyを$resに出来るのでしょうか?

    • ベストアンサー
    • Perl
  • 次の要素の値取得

    XSLで、要素の値の取得方法がわかりません。 ご教授いただければうれしいです。 XML----------------------------------- <data> <num1>test</num1> <title>title</title> </data> <data> <num2>test2</num2> <title>title</title> </data> で、XSL内で、 <xsl:template match="num1"> // ここで、num2があるか判断したい </xsl:template> ということは、出来るのでしょうか?

    • ベストアンサー
    • XML

専門家に質問してみよう