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: $!";
ていうか、ここにあった説明です……(汗)
#上記送信フォームほか、掲示板やチャットでもご意見ご感想お待ちしております。なおいただいた内容は(もちろんプライバシーに配慮したカタチで)日記の話題に取りあげることがあります。あらかじめご了承ください。
サイト目次
■おすすめグッズ
本 / 映画 / 音楽 / テレビ番組 / プレゼント・ギフト / ホーム&キッチン / エレクトロニクス / おもちゃ&ホビー / ダイエット・健康
■おすすめ情報・知識
パソコン / インターネット / メール / ホームページ作成 / CGI / Perl
■おすすめネタ
■おすすめ特集
「Kissin' Christmas CD化」計画 / 「フォーク並び」推進計画 / 追悼ステファン・グラッペリ 他、いろいろ。
■おすすめCGI
■おすすめリンク
サイト内検索
[
↑このページの先頭へ移動する
|
このコーナーの目次を表示する
]
注)このページ自体が目次ページという場合があります。