--- title: 『新版Perl言語プログラミングレッスン入門編』第11章 ファイル操作のつづき author: kazu634 date: 2008-03-15 url: /2008/03/15/_905/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3827;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---

 つづきだよー

ファイルテスト演算子 -e

 あるファイルが存在するかどうかをチェックしたいときは「-e」を用いる。

use strict;
use warnings;
if (-e 'datafile.txt') {
print 'Exists!', "\n";
} else {
print 'Not Exists', "\n";
}

ファイルテスト演算子 -sと-z

 ファイルのサイズを知りたいときは-sを用いる。「サイズが0かどうか」を知りたいときは-zを用いる。

use strict;
use warnings;
print -s 'datafile.txt';

ファイルテスト演算子 -M

 ファイルの古さを調べたいときに、-Mを用いる。

ファイルテスト演算子 -Tと-B

 「テキストファイルかどうかを調べる」のが-Tで、「バイナリファイルかどうかを調べる」のが-Bです。ちなみ日本語が含まれていると、「バイナリファイル」として認識されることに注意。

ファイルグロッブ

 こいつを使うと、カレントディレクトリのファイルを簡単に列挙できる。使い方は

<ワイルドカード>

となる。例は、

while (<*.txt>) {
print $_, "\n";
}

練習問題 — その1

 引数にディレクトリが与えられれば、ディレクトリ内部を表示。引数にファイルを与えられれば、ファイルの中身を表示する。

use strict;
use warnings;
# 引数が指定されていない場合
if (@ARGV == ) {
print 'Please give the argument.', "\n";
print 'For Example: perl temp.pl /', "\n";
exit;
}
# 引数を $arg に格納する
my $arg = shift;
# 引数がディレクトリとして認識できる
if (-d $arg) {
# ディレクトリを開く
opendir(DIR, $arg) or die "$!";
# ディレクトリの中を一つ一つ @file に格納する
while (my $file = readdir(DIR)) {
# 親ディレクトリ・カレントディレクトリならば表示しない
next if ($file eq '.');
next if ($file eq '..');
# ファイル or ディレクトリを表示する
print $file, "\n";
}
# きちんとディレクトリを閉じなきゃね
closedir(DIR);
}
# 引数がファイル名として認識可能
if (-f $arg) {
# ファイルを開く
open(FILE, $arg) or die "$!";
# ファイルの内容を @f_content に格納する
my @f_content = <FILE>;
# 一気に表示
print @f_content;
# 閉じる
close(FILE);
}

練習問題 — その2

No. 0010 615

No. 0009 602

No. 0008 569

No. 0007 549

No. 0006 535

No. 0005 514

No. 0004 23

No. 0003 19

No. 0002 10

No. 0001 4

No. 0000 1

こいつはメールマガジンの購読数の推移を示したもの。こいつの購読数の伸びを計算するプログラムを作る。

use strict;
use warnings;
# 変数の宣言
my @nums = ();
my @tmp_vols = ();
my @tmp_nums = ();
# ファイルを開く
open(FILE, 'mmlog.txt') or die "$!";
while (my $data = <FILE>) {
# 一行ずつ読み込んで@dataに格納
@nums = split(/\s+/, $data);
# @tmp_volsと@tmp_numsに格納
push (@tmp_vols, $nums[] . $nums[1]);
push (@tmp_nums, $nums[2]);
}
# ファイルを閉じる
close(FILE);
# 実際に表示させる
for (my $i=; $i < @tmp_vols - 2; $i++) {
print $tmp_vols[$i], '-', $tmp_vols[$i + 1], ' --> ', $tmp_nums[$i] - $tmp_nums[$i + 1], "\n";
}