
ある文字を検索して、その行を含む&1行前と2行後ろの行までを削除するスクリプトを書きたいのですが、上手くいきません。
検索して行番号を獲得して、
$rowという変数に入れました。
それをさらに
$a :1行前
$b :2行後ろの行番号に格納しました。
問題は削除するところが上手く行きません。
next if で $aから$bの行番号を削除して、と頼んでいるのですが、空のファイルに上書きされてしまいます。
お願いです。この方法で何が間違っているかを教えてください!
#!/opt/perl/5.8.0/bin/perl -w
print "Content-type: text/html\n\n";
use CGI qw(:standard);
use CGI::Carp qw/fatalsToBrowser/;
$filename = "../XML/link.xml";
$new = "../XML/link.xsl";
open(FILE, $filename) or die "Can't open `$filename': $!";
while (<FILE>) {
if($_ =~ /HRWeb/){
#print "$.";
$row = $.;
$a = $row-1;
$b = $row+2;
print "HRWeb delete rows $a through ";
}
}
&delete ($a, $b);
sub delete{
open( OLD, "< $filename" );
open( NEW, "> $new" );
while ( <OLD> ) {
next if /$a/../$b/; # copy everything but $a through $b
print NEW $_;
}print "$a deleted $b";
close( OLD );
close( NEW );
rename( $filename, "$filename.orig" );
rename($new, $filename );
}
No.3ベストアンサー
- 回答日時:
>next if /$a/../$b/;
>これですね。こんな書き方はできません。
そうですね。
next if $.==$a..$.==$b;
とは書けます
ありがとうございます!
スクリプトに変数の指定意外変更する必要なく成功させることができました。
many many thanks です!
ですが、午前中ずっと葛藤を続けていて、コマンドラインでは上手く行くのに、ウェブサーバーからだと実行されなくて、午後にようやく、フォルダーの権限がwriteになっていないことが判明しました・・・
おっとっと。
No.6
- 回答日時:
これは少し関係ないことですが…
> &delete ($a, $b);
こう書いていて sub delete の方で @_ を受け取らずにそのまま $a, $b を使うのは書き方が変です。(動かないわけではありませんが…)。
あと FILE の close() がありません。Perl なのでなくてもいいんですが、 close() されないままだとプログラムが終了するまでファイルディスクリプタを一つ使いっぱなしになると思うので、使い終わったらなるべく close() しておくのがおすすめです。
で、 delete の中ですが
> next if /$a/../$b/;
こうじゃなくてもっと普通に書けばいいのでは?
たとえばこう書くとか。
next if ($. >= $a && $. <= $b);
No.5
- 回答日時:
>next if $a..$b;
>だと ($a, $b がどちらも数値ならば) 「$. が $a と $b の間 next を実行する」という意味.
間違い
「$. が A と B の間 next を実行する」という意味.
になるのは、整数"定数"の時
No.4
- 回答日時:
next if /$a/../$b/;
じゃなくって
next if $a..$b;
なら動くかも.
蛇足: スカラーコンテキストにおける範囲演算子 .. の振舞い.
a .. b において
1) .. の前後がどちらも数値の場合は a <= $. && $. <= b の意味
2) そうでないときは「論理式 a が成り立ってから論理式 b が成り立つまで」の意味
next if /$a/../$b/;
という書き方は可能で「$a (に入っている正規表現) にマッチしてから $b (に入っている正規表現) にマッチするまで next を実行する」という意味.
next if $a..$b;
だと ($a, $b がどちらも数値ならば) 「$. が $a と $b の間 next を実行する」という意味.
No.2
- 回答日時:
とりあえず質問内容を元に自分で組んでみました。
$char = 'abc'; #対象文字列
$file = './file'; #ファイル
open(OUT, "> $file.tmp");
open(IN, "< $file");
$skip = 0;
$tmp = '';
while(<IN>){
if($skip){
$skip++;
if($skip == 4){$skip = 0;}
}else{
if(/$char/g){$skip = 1;}
if($skip == 0){print OUT $tmp;}
}
$tmp = $_;
}
if($skip == 0){print OUT $tmp;}
close(IN);
close(OUT);
rename("$file.tmp","$file");
> お願いです。この方法で何が間違っているかを教えてください!
next if /$a/../$b/;
これですね。こんな書き方はできません。
書くなら
unless($. <= $b && $. >= $a){print NEW;}
とか。(ちなみに$_は省略できます。)
どうもありがとうございます!!
このスクリプトでも上手く行きました。
ただ、私のような初心者ではどれが何言っているのか分からなくて、プロダクションで使うのにはリスキーだと思ったので、今回は辞めましたが、非常に参考になりました。
ありがとうございます。
No.1
- 回答日時:
基本的には、コレで良いと思いますが、
FILE
がclose されずに、&delete でrename しようとしているので、
rename は、両方失敗してしまうと思います。
あと、カレントディレクトリが思う所になっているか、確認するといいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPコードをはじめ、記号や記述...
-
正規表現の一致について
-
クイズCGI
-
データフォルダ参照先
-
powerpointでwebページとして保...
-
perlでCSV形式ファイルのア...
-
Perlで文字列の操作がしたい
-
foreachによるカウント方法
-
Shift-jisで正規表現
-
ユーザー登録型のサイトを作成...
-
画像ファイルの作成方法
-
Cシェルでのファイル編集について
-
特殊文字の数を調べる
-
シェルでfind結果を文字列で比...
-
リストボックスから選択、結果...
-
PerlとUnixの関係
-
ディレクトリ構造の表示
-
GD.pmで作成した画像を保存する...
-
ファイルの入出力2
-
どこがおかしいですか?教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
fgets で値が取得できない
-
行を指定して削除する方法PERL
-
csvファイルの横方向への改行に...
-
drtファイルはどうしたら開...
-
MATLABのm-fileについて
-
JSP URLに表示される拡張子 .jsp
-
オブジェクト作成の順番
-
WindowsでPerlをする際,1行目の...
-
ファイル検索の条件について
-
Perl の「stringify」の意味に...
-
perl ファイルが開かない
-
Javaのフォームの入力欄に文字...
-
一つのテキストファイルと複数...
-
MP3情報の表示
-
PerlでのUseless use...
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
MySQLにバイナリデータを正常に...
おすすめ情報