10 KiB
10 KiB
title | author | date | wordtwit_post_info | categories | ||
---|---|---|---|---|---|---|
『新版Perl言語プログラミングレッスン入門編』第11章 ファイル操作のつづき | kazu634 | 2008-03-15 |
|
|
つづきだよー
ファイルテスト演算子 -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"; }