Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発
  1. Perl
  2. モジュール
  3. here

File::Temp - 一時ファイルを作成する

File::Tempを使用すると、一時ファイル一時ディレクトリを作成することができます。OSに依存せず安全な方法で一時ファイル(あるいは一時ディレクトリ)を作成することができます。

# モジュールの読み込みと関数のインポート
use File::Temp qw/tempfile tempdir/;

一時ファイルを作成するにはtempfile関数を使用します。戻り値はスカラコンテキストの場合は一時ファイルのファイルハンドル、リストコンテキストの場合は一時ファイルのファイルハンドルとファイル名になります。

# 一時ファイルの作成
$fh              = tempfile;
($fh, $filename) = tempfile;

一時ディレクトリを作成するにはtempdir関数を使用します。

# 一時ディレクトリの作成
$dir = tempdir;

一時ファイルを利用してファイルを安全に上書きするサンプルです。(※1)

# ファイルの安全な上書き
use File::Temp 'tempfile';
use File::Copy 'move';

my $file = shift;

# ファイルの内容の取得
my $old = get_content($file);

# テキストを追加
my $new = $old . "Add new text";

# 新しい内容をファイルに書き込み
my ($tempfh, $tempfile) = tempfile;
print $tempfh $new;
close $tempfh;

# 新しいファイルを古いファイルに上書き
move $tempfile, $file
  or die "Can't move \"$tempfile\" to \"$file\": $!";

sub get_content {
  my $file = shift;
  
  open my $fh, '<', $file
    or die "Can't open file \"$file\": $!";
  
  my $content = join('', <$fh>);
  
  close $fh;
  
  return $content;
}

(参考)File::Copy

tempfileのオプション

tempfileの引数としてオプションを指定することができます。

# tempfileのオプション
tempfile(DIR => 'somedir', SUFFIX => '.dat');
DIR 一時ファイルが作成されるディレクトリ
SUFFIX 一時ファイルの末尾に付加する拡張子

DIRが省略された場合は一時ファイルを作成するディレクトリは自動的に決められます。Unixの場合は/tmpになります。

※1 ファイルを読み書きモードでオープンして、読み込んだファイルに書き込むのは安全性に欠けます。書き込み途中でコンピュータがクラッシュした場合、読み込む前のデータが破損してしまうからです。読み込んだファイルとは別のファイルに書き込んでから、そのファイルで上書きするのが安全です。