1. ホーム
  2. スクリプト・コラム
  3. パール

Perlによるファイル操作の例

2022-01-29 07:59:14

perlで最も使われるのはファイル操作なので、以下に具体的な例を挙げてperlのファイル操作の理解を深めるために、いくつかまとめてみました。

ファイルの削除

unlink $file、unlink $file1、$file2、$file3 のような unlinke 関数を使用します。

ファイルを開く

スキーマとファイル名を区別するのが非常に簡単で、perl 5.6 以降でサポートされている 3 つの引数形式を使用してファイルを開くことができます。

コピーコード コードは以下の通りです。

#Open the 'txt' file for reading
open FH, '<', "$file_name.txt" or die "Error:$!n"; #Open the 'txt' file for writing. already exist #and will delete/overwrite a pre-existing file of the same name open FH, '>', "$file_name.txt" or die "Error:$!n& quot;;
#Open the 'txt' file for appending. Creates the #file_name if it doesn't already exist
open FH, '>>', "$file_name.txt" or die "Error:$!n";
#Open the 'txt' file for a 'read/write'. #Will not create the file if it doesn't #already exist and will not delete/overwrite #a pre-existing file of the same name
open FH, '+<', "$file_name.txt" or die "Error:$!n"; #Open the 'txt' file for a 'read/write'. Will create #the file if it doesn't already exist and will #delete/overwrite a pre-existing file #of the same name open FH, '+>', "$file_name. txt" or die "Error:$!n";
#Open the 'txt' file for a 'read/append'. Will create #the file if it doesn't already exist and will #not delete/overwrite a pre-existing file #of the same name
open FH, '+>>', "$file_name.txt" or die "Error:$!n";

ファイル全体を一度に読む

スカラー環境では1行ずつ、リスト環境では全行を一度に読み込むために <> を使用すると、$/ には行の区切り文字が格納され、それはデフォルトでは改行なので、スカラー環境で全行を一度に読み込めるように $/ を変更します(もう行という概念がなく、単にファイル全体を読みます)。しかし、これでは遅い。終わったら$/を元に戻すのを忘れないように。

コピーコード コードは以下の通りです。

#! /usr/bin/perl
use strict ;
use warnings ;
sub test{
    open FILE, '<', "d:/code/test.txt" or die $! ;
    my $olds = $/ ;
    $/ = undef ;
    my $slurp = ;
    print $slurp, "n" ;
    $/ = $olds ;
    close FILE;

&test() ;

また、local キーワードを使って $/ をローカル変数として設定すると、スコープ外にジャンプした後、$/ は元の値に戻ります。
コピーコード コードは以下の通りです。

#! /usr/bin/perl
use strict ;
use warnings ;
sub test{
    local $/ ; #???? local $/ = undef ;
    open FILE, '<', "d:/code/zdd.txt" or die $! ;
    my $slurp = ;
    print $slurp, "n" ;
}
&test() ;

自分で書くより安全なモジュールを使うのが一番です。File::SlurpやIO::Allは大丈夫です。

ファイルを開くには、二重引用符を使用します。

ファイルを開くとき、ファイル名に変数置換がある場合は、シングルクォートではなく、ダブルクォートを使用した方がよい。シングルクォートは変数補間を無視するからである。

コピーコード コードは以下の通りです。

open FILE "<$file" or die $! ; #This will work.
open FILE '<$file' or die $! ; #This will not work, because $file will not be interpreted as variable interpolation. Likewise<will not be interpreted as input

ファイルハンドルをパラメータとする

引数が1つで、ある種のファイルハンドルを持つ関数testがあるとすると、その引数はどのように渡すのでしょうか?

方法1、引数を渡すとき、ハンドルの前に*を付ける。

コピーコード コードは以下の通りです。

sub main {
    open FILE, '+<', 'test.data' or die $! ;
    &test(*FILE);
    close FILE;
}

方法2、フォームを使用してファイルを開く open my $FILE
コピーコード コードは以下の通りです。

sub main {
    open my $FILE, '+<', 'test.data' or die $! ;
    &test($FILE);
    close $FILE;
}