Perl ファイル入出力 チートシート

 自分用の覚え書き。
 ファイル入出力はロックの仕方、出力ディレクトリの作成、入力ファイルの存在確認と、忘れるものが山積み。

ファイル入出力

#!/usr/local/bin/perl
=pod
ファイル入出力の基本。
=cut
use strict;
use warnings;

# perl モジュール
# Fcntl は使えない場合もあるため、レンタルサーバーの場合はチェックすること。
use Fcntl qw/:flock/; # perl 5
use Encode qw/decode_utf8 encode_utf8/; # perl v5.7.3

# ファイル出力
my $output_path = "./test/";
my $output_file = $output_path ."test-file.txt";
# 出力ディレクトリがなければ作成
if (! -d $output_path) {
  mkdir($output_path);
}
# 追記
open my $fh, '>>', $output_file or die "Can't open file $output_file : $!";
flock($fh, LOCK_EX);
print $fh encode_utf8("output test!\n");
flock($fh, LOCK_NB);
close $fh or die "Can't close file $output_file: $!";

# ファイル入力
my $input_file = $output_file;
# 入力ファイルが存在しない場合はエラー
if (! -f $input_file){
  die "Not found $input_file";
}
print "--- input_all ---", "\n";
&input_all($input_file);
print "--- input_line ---", "\n";
&input_line($input_file);

# ファイルの中身を一度に取得
sub input_all {
  my ($input_file) = @_;

  # $/ は入力レコード区切り文字。デフォルトは改行。
  # undef を指定することにより、一度に読み込むことが可能になる。
  open my $fh, '<', $input_file or die "Can't open file $input_file : $!";
  my $input = do { local $/; <$fh> };
  close $fh or die "Can't close file $input_file: $!";

  chomp $input;
  print $input, "\n";
}

# ファイルの中身を一行ずつ取得
sub input_line {
  my ($input_file) = @_;

  open my $fh, '<', $input_file or die "Can't open file $input_file : $!";
  while (my $line = <$fh>) {
    chomp $line;
    print $line, "\n";
  }
  close $fh or die "Can't close file $input_file: $!";
}