Perlのopen関数は、その名の通り指定されたパスのファイルをオープンし、ファイルハンドルを通じて読み書きするための関数です。
プログラミング言語にとって最も基本的な関数です。しかし、Perlでは歴史的経緯により使い方が変わってきた関数でも有り、イマドキの書き方が十分に普及していない関数でもあります。もの凄く色々な使い方のできるopen関数ですが、ここでは必要最小限の使い方に絞って解説します。
open関数は引数として、ファイルハンドル、モード、ファイルパスの3つを取ります。
使用例
my $path = '/path/to/file.txt';
open(my $fh, '>', $path) or die $!;
- 第1引数
- 第2引数
- 第3引数
- エラー処理(or dieの指定)
ファイルハンドルには未定義のスカラー変数を渡します。
ファイルの読み/書き、上書き/追加等のファイルアクセス時のモードを指定します。更にPerl5.8以降ではファイルの文字コードを指定出来る様になっています(後述)。
| モード | 意味 | 指定ファイルが無い時 |
|---|---|---|
| > | 書き込み(上書き) | 新規作成 |
| >> | 書き込み(追加) | 新規作成 |
| < | 読み込み | エラー |
なお、あまり使う事は無いと思いますが、モードの先頭に「+」を追加すると、読み書きの両方に使える様になります。ただし、「+<」ではファイルは新規作成されないので気をつけて下さい。
ファイルパスを指定します。相対パスでも、絶対パスでもokです。
open関数の後ろの「or die $!」は、ファイルのオープンに失敗した時にdieするための指定です。「$!」にはエラーメッセージが入ります。
open関数が成功すれば、取得したファイルハンドルを通じて、ファイルの読み書きが出来ます。もっと基本的な使い方は以下の2パターンです。
- 山かっこ演算子を使って、ファイルの読み込みを行う。
使用例
my $path = '/path/to/file.txt';
open(my $fh, '<', $path) or die $!;
while(<$fh>) {
print $_; # ファイルから1行単位に読み込んだ結果をそのまま標準出力へ出力します。
}
使用例
my $path = '/path/to/file.txt';
open(my $fh, '>', $path) or die $!;
print $fh "output!\n"; # ファイルハンドルを通じて引数の文字列を出力します。
print関数の引数は、ファイルハンドルと文字列の間をスペースにする事に注意!
使い終わったファイルハンドルはきちんとclose関数でクローズしましょう。
close($fh);
Perlで日本語を扱う時に重要な事項として、第2引数のモードにファイルの文字コード指定を追加できる点が挙げられます。
使用例(UTF-8のテキストファイルを読み込み)
my $path = '/path/to/file_UTF-8.txt';
open(my $fh, '<:encoding(UTF-8)', $path) or die $!;
while (<$fh>) {
print length($_);
}
この「:encoding(UTF-8)」指定により対象のファイルがUTF-8でエンコードされているとPerlが認識します(読み込んだ時にutf8フラグが付く)。その結果、上記の例ではlength関数は読み込んだ行データのバイト数ではなく、文字数を数えてくれます。
また、他の文字コード(Shift-Jisや、UTF-16等)を指定すると自動的に、Perlの文字列の内部表現であるUTF-8にコンバートしてくれます(utf8フラグも付きます)。
使用例(シフトJISのテキストファイルを読み込み)
my $path = '/path/to/file_ShiftJIS.txt';
open(my $fh, '<:encoding(shiftjis)', $path) or die $!;
while(<$fh>) {
print length($_);
}
読み込んだ段階でシフトJISからUTF-8に変換されているので、Perlは文字数を数える事が出来ます(PerlはシフトJISの事はさっぱり分からないのでシフトJISのままでは文字数を数える事が出来ません)。
テキストファイルへ書き出す時も同様です。UTF-8の内部表現から指定した文字コードに変換しながら書き出す事が出来ます。
Perlの文字列内部表現はUTF-8であるため、他の文字コード形式のデータを読み書きする際は必ずコード変換が発生する事に注意して下さい。思わぬバグの元になります。
テキストファイルを読み書きする時は必ず対象のファイルの文字コードを指定する、という事を忘れないようにしましょう。

コメントする