• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:until文)

ファイルから特定の範囲を除外するプログラムがうまく動かない

このQ&Aのポイント
  • ファイルから特定の範囲を除外するプログラムを書いていますが、うまく動作しません。
  • プログラムでは特定の範囲の行を削除したいです。
  • 何か間違いがあるのでしょうか?教えてください。

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

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

こんばんは。お礼ありがとうございます。 >消した部分に別のファイルから読み込んだものを >書き加えたいのですが、どこに何を付け加えたら >よいのでしょうか? 「なにぬねの」の行でフラグ(意味がわかるよう変数名は書き換えました) を元に戻すときにその処理を入れてやりましょう。 $infile = "file2"; # 読み込むファイル名を指定 $skip = 0; while (<>) { if (/なにぬねの/) { $skip = 0; # フラグをクリア open IN, $infile; # ファイルハンドル IN でオープン while ($line = <IN>) { # IN から1行ずつ $line に読み込む print $line; } close IN; # 帰りは戸締りを忘れずに print "\n"; } # End of if (/なにぬねの/) print if $skip == 0; $skip = 1 if /たちつてと/; } print "\n"; 参考書はお持ちでしょうか。オライリー・ジャパンの「初めての Perl 第3版」 (Randal L. Schwartz、Tom Phoenix 著、近藤 嘉雪訳)などどうぞ。 http://www.oreilly.co.jp/BOOK/lperl3/

参考URL:
http://www5a.biglobe.ne.jp/~n_rieko/perl/,http://www.rfs.co.jp/sitebuilder/perl/05/
aattmm
質問者

お礼

nightowlさま、ありがとうございます。 参考図書、参考URLも教えていただき、 本当にありがとうございました。 早速、本を買って勉強したいと思います!!

その他の回答 (2)

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

訂正です。chomp し忘れてましたね。 でも、「$_」にすでに改行が含まれていることをうまく利用して print "$_\n" if $a == 0; のところは print if $a == 0; と書けます(print は引数なしで $_ を出力するから)。 そして最後に「print "\n";」してやりましょう。 それから、if 文や while 文などブロックの外側の「;」は必要ありません。

aattmm
質問者

お礼

ありがとうございました!! 出来ました! 更に質問なのですが、 消した部分に別のファイルから読み込んだものを 書き加えたいのですが、どこに何を付け加えたら よいのでしょうか?

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

こんにちは。until もループの1種ですから while ループの中で使うと ぐーんと遅くなりますし、このように脱出条件を間違えると 無限ループしてしまいます。ループの中だけ単純に書きますと、 $a = 0; # フラグ変数はループの外に出して while (<>) { $a = 0 if /なにぬねの/; print "$_\n" if $a == 0; $a = 1 if /たちつてと/; } その他ここの問題点として、 if($a = 1){ }else{ print "$_\n"; }; }; ・「$a = 1」は代入式です。条件判定なら「$a == 1」としなければ。 ・if ブロックの中身が空です。条件をひっくり返すか、 unless を使ったほうがいいでしょう。 unless ($a == 1) { print "$_\n"; }

関連するQ&A