- ベストアンサー
ログファイルに指定行または指定場所での書き込み方法
- 指定行または指定場所に書き込むためのログファイルのスクリプトを変更する方法はありますか?
- dat.cgiファイルに指定行または指定場所で書き込む方法を教えてください。
- ログファイルの特定の行数または文字列の間に書き込むためのスクリプトの変更方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
たぶん、大丈夫だと思います。というのも、私自身は File::Copy を使ったことがなく、「プログラミング Perl」を読んで確認した次第です。 copy の場合も、open や close と同様に後ろに or die ... を付けることを お勧めします。こうすると、失敗したときに有益な情報が得ることができます。
その他の回答 (3)
- kumoz
- ベストアンサー率64% (120/185)
実際のファイルの内容とは違うでしょうが、log.cgi と dat.cgi は次のようにしています。 log.cgi aaa<>bbb<>ccc<>ddd bbb<>ccc<>ddd<>eee ccc<>ddd<>eee<>fff ddd<>eee<>fff<>ggg eee<>fff<>ggg<>hhh fff<>ggg<>hhh<>iii ggg<>hhh<>iii<>jjj dat.cgi <><> <><> <><> <><> <><> スクリプトは、なるべく元のコードを使っています。 なお open と close は、失敗したときのために die を付け加えました。 open(IN, "log.cgi") or die "Can't open log.cgi: $!"; @f_data = <IN>; close(IN) or die "Can't close log.cgi: $!"; $i = 1; open(FILE, "dat.cgi") or die "Can't open dat.cgi: $!"; open(OUT, ">new_dat.cgi") or die "Can't open new_dat.cgi: $!"; select OUT; while ($line = <FILE>) { if ($. == 3) { print "<>"; foreach (@f_data) { if ($i > 5) { last; } ($f_data1, $f_data2, $f_data3, $f_data4) = split(/<>/); print "$f_data1"; $i++; } print "<>\n"; } else { print $line; } } select STDOUT; close(FILE) or die "Can't close dat.cgi: $!"; close(OUT) or die "Can't close new_dat.cgi: $!"; このスクリプトを実行すると、new_dat.cgi の内容は次のようになります。 <><> <><> <>aaabbbcccdddeee<> <><> <><>
お礼
何度もお手数をおかけいたしました。本当に有難うございます。おかげ様で解決することができました。 ちなみに、new_dat.cgiに書き出された内容を、dat.cgiに反映させるために以下のものを「close(OUT) or die "Can't close new_dat.cgi: $!";」の下の行に追加してみました。いつも改造するときは余りわからず適当に考え付いた機能を追加していっているため、これでいいのかあまり自信がありません。これで問題ありませんでしょうか。宜しければご確認いただければ幸いです。 use File::Copy; $data = 'data.cgi'; $newdata = 'new_data.cgi'; copy( "$newdata", $data );
- kumoz
- ベストアンサー率64% (120/185)
別のファイルに出力する方法です。 open(FILE, "dat.cgi"); open(OUT, ">new_dat.cgi"); while ($line = <FILE>) { if (cond) { # 条件に合う行であれば、新たな出力をここに書く } else { print OUT $line; # 変更の必要のない行をそのまま出力 } } .... while ループで dat.cgi を1行ずつ読み込んで、目的の行を探します。 100 行目であれば、cond のところを $. == 100 とします。 別ファイルに出力すれば、dat.cgi はそのままにスクリプトを直して 実行するたびに、新たに new_dat.cgi 作り直してくれます。 ファイルの中身を確認しながら、頑張ってみてください。
お礼
有難うございます。教えていただいた内容で以下の処理のスクリプトを改造しようと何度も試みてみましたが、素人のため、思ったようになかなか動作させることができません。大変お手数ですが、以下スクリプトで教えていただいた内容の動作をさせるにはどのように以下スクリプトを書き直せばよろしいのでしょうか?宜しくお願いいたします。 open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; #書き出し先ファイルをオープン open( OUT, ">dat.cgi" ); select OUT; foreach( @f_data ){ #5行超えたら処理を抜ける if( $i > 5 ){ last; } #一行の内容を<>で分割して、先頭4つを変数に取る ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); #1つ目を書き出す print "$f_data1"; $i++; } #書き出し先ファイルを閉じる select STDOUT; close( OUT );
- kumoz
- ベストアンサー率64% (120/185)
質問以前の問題として、 open(OUT, ">dat.cgi"); のように書くと、dat.cgi の内容はすべて捨てられてしまいます。 肝心の質問の方ですが、できないというのが回答になると思います。 出力ファイルハンドルを通して、任意の行に書き出したり、 挿入することはできません。これを行うには一度入力用にファイルを オープンし、配列などに格納して加工してから、ファイルを出力用に 再オープンして書き出す、という作業が必要です。 open(FILE, "dat.cgi"); @file = <FILE>; @file を加工 open(FILE, ">dat.cgi"); @file を出力
お礼
参考意見をありがとうございます。 > のように書くと、dat.cgi の内容はすべて捨てられてしまいます。 そうですね。そのようになるように現在は使われています。 この現在使われてるスクリプトで上記質問内容の事を行うには、どのように書き直せばよいのか知りたいため質問させていただきました。 Perlは勉強しはじめの素人のため、何となくできそうかなと自分なりにも試行錯誤しておりましたが、かなりの改造をしないと上記内容は難しいということになるのでしょうか?もう少し自分なりにも工夫してみて、その間に改造できるという回答が得られないようでしたら諦めることにします。
補足
dat.cgiの中身を以下のようにすれば、上記質問内容は実現可能でしょうか? ---------------------------------- 1<><> 2<><> 3<><> 4<><> 5<><> ---------------------------------- log.cgiの$f_data1の部分を3行目の2番目に書き出す。 ---------------------------------- 1<><> 2<><> 3<>ここに書き出す。<> 4<><> 5<><> ---------------------------------- このような方法でなら可能ではないでしょうか?で、自分なりにこの方法で試行錯誤していましたが、やはり私の知識ではなかなか書けそうにありません。どなたかお力をお貸しいただけないでしょうか。宜しくお願いいたします。
補足
or dieを付けて完成させました。いろいろとご指導頂き誠に有難うございました。m(__)m