Perl初心者の間:ファイル操作関連

ファイルの特定の一行を変更する/ファイルのある行を削除する/ ファイルの中程で一行挿入する/ファイルの先頭に追加するには?

ファイルの特定の行を変更・削除したり、あるいはファイル先頭に行を追加する場合、よく見かけるのは次の方法。

$old = $file;
$new = "$file.tmp.$$";

open(OLD, "< $old") 	or die "can't open $old: $!";
@log = <OLD>;
close(OLD)				or die "can't close $old: $!";

foreach $log ( @log ){
	#置換処理などをここで……
	#s/\b(p)earl\b/${1}erl/i;

}

open(NEW, "> $new") 	or die "can't open $new: $!";
print NEW @log			or die "can't write to $new: $!";
close(NEW)				or die "can't close $new: $!";

「@log = <OLD>」即ち配列にファイルのデータを格納・処理する方法。しかし、ファイルのデータが大きい場合、メモリをたくさん使用するため、あまり良くないとか(例えばWEB相談室系の投稿では確実にツッコミがくる……)。

では、配列を使わずにファイルの特定の行を操作するにはどうすればいいのか? 簡単な方法があるのか?……実は直接的な方法がないのだとか。

一般的な解決策は、変更処理したテキストファイルの「コピー」を作り、その後オリジナルを上書きしてしまうという方法になります。

$old = $file;
$new = "$file.tmp.$$";
$bak = "$file.bak";

open(OLD, "< $old") 	or die "can't open $old: $!";
open(NEW, "> $new") 	or die "can't open $new: $!";

while (<OLD>) {
	#置換処理などをここで……
	#s/\b(p)earl\b/${1}erl/i;

	(print NEW $_)		or die "can't write to $new: $!";
}

close(OLD)			or die "can't close $old: $!";
close(NEW)			or die "can't close $new: $!";

rename($old, $bak)		or die "can't rename $old to $bak: $!";
rename($new, $old)		or die "can't rename $new to $old: $!";

ていうか、ここにあった説明です……(汗)


このページのご意見・ご感想は?
1.とっても良かった! 2.部分的に良かった 3.まぁまぁかな 4.説明が足りないぞ! 5.期待はずれ〜 6.その他
※具体的なご意見ご感想などがあれば、下のメッセージ欄へご記入どうぞ!(未記入でも送信可)

#上記送信フォームほか、掲示板チャットでもご意見ご感想お待ちしております。なおいただいた内容は(もちろんプライバシーに配慮したカタチで)日記の話題に取りあげることがあります。あらかじめご了承ください。


サイト目次

おすすめグッズ

/ 映画 / 音楽 / テレビ番組 / プレゼント・ギフト / ホーム&キッチン / エレクトロニクス / おもちゃ&ホビー / ダイエット・健康

おすすめ情報・知識

パソコン / インターネット / メール / ホームページ作成 / CGI / Perl

おすすめネタ

雑学メモ / ときたまメモ / フリートーク

おすすめ特集

「Kissin' Christmas CD化」計画 / 「フォーク並び」推進計画 / 追悼ステファン・グラッペリ 他、いろいろ。

おすすめCGI

CGI更新状況 / 日記 / チャット(P.M.10:30〜かも?) / 掲示板 / 画像投稿掲示板 / お絵かき掲示板 / ご意見・ご感想

おすすめリンク

サイト内検索

[ ↑このページの先頭へ移動するこのコーナーの目次を表示する ]
注)このページ自体が目次ページという場合があります。