Perl入門 ≫ LESSON17 ファイル
ファイル
Perlでは、ファイルの状態を調べたり、ファイルへの読み書き等の操作を行うことができます。
いずれの操作にしても、ファイルを指定する必要があるので、ファイルやディレクトリ・パスについて理解していることが前提となります。
ディレクトリやファイルを作成する時、カレントディレクトリはスクリプトを実行したディレクトリということになります。
ファイル・ディレクトリの指定方法は、カレントディレクトリからの相対パスか、絶対パス指定となります。
ファイル演算子
ファイル演算子は、ファイル名・またはファイルハンドルを引数にして、与えられた条件が真かどうか判断することができます。
(ファイルハンドルについては入出力の所で説明します。)
演算子 ファイル名(またはファイルハンドル)
-r | 実効uid/gidでファイルの読み込みが可能 |
---|---|
-w | 実効uid/gidでファイルの書き込みが可能 |
-x | 実効uid/gidでファイルの実行が可能 |
-R | 実uid/gidでファイルの読み込みが可能 |
-W | 実uid/gidでファイルの書き込みが可能 |
-X | 実uid/gidでファイルの実行が可能 |
-o -O | 実効/実 uid/gidがファイルの所有者である |
-e -z | ファイルが存在する。/ ファイルサイズが0である。 |
-s | ファイルが存在し、サイズが0でない。サイズを返す。 |
-f -d | ファイルが普通のファイル/ディレクトリである。 |
-l -S -p | ファイルが シンボリックリンク/ソケット/名前付きパイプ である。 |
-b -c | ファイルが ブロック/キャラクタ 特殊ファイルである。 |
-u -g -k | ファイルにsetuid/setgid/stickyビットがセットされている。 |
-t | ファイルハンドル(デフォルトではSTDIN)がttyにオープンされている。 |
-T -B | ファイルがテキスト/非テキスト(バイナリ)ファイルである。 ファイルが空だったり、ファイルハンドルをテストしている途中でEOF(ファイルの終わり)に到達した場合には真を返す。 |
-M -A -C | ファイルの 更新/参照/inode更新 時刻。 戻り値は、プログラムを開始した時点からの日数を浮動少数で返す。 |
ファイルが存在するかどうか調べます。
if(-e "test.pl") {
print "file exsist!";
}
結果は以下。
file exsist!

実id = 実ユーザID
本来のユーザID。
実効id = 実効ユーザID
権限チェックで用いられるユーザIDで、通常は実ユーザIDと一致します。

シンボリックリンクとは、一つのファイルに複数の名前を付けることができる機能です。 シンボリックリンクを利用すれば、別の名前でファイルを参照することができるので、 そこに目的のディレクトリやファイルがあるかのように見せることができるます。
シンボリックリンクファイルは、一見ファイルのように見えますが実は単に別のあるファイルやディレクトリを指しているだけのものです。 そのリンクを指定することで、指している先のものを指定したのと同じことになります。
さて、どうやってシンボリックリンクを作るかと言うと、次の様にします。
ln -s 実体のファイル・ディレクトリ名 リンクの名前
この辺は掘り下げるとわりと深いので、ここでの説明は省略します。 ですが、シンボリックリンクを作る時は削除の問題とかで色々気を付けねばならない事だけ覚えておいてください。
ファイル操作
ファイルを操作する関数は、操作が成功したファイル数を返します。
●chmod
chmod モード, ファイル
ファイルリストのパーミッション(権限)を変更します。 リストの先頭要素はモードを表す数値データ。8進数(0で始まる数値)で表します。
#ファイルtest.plのモードを変更します。
my $k = chmod 0755, "test.pl";
print "$k";
●chown
chown ユーザID, グループID, ファイルリスト
ファイルリストの所有者とグループを変更します。idは数値です。
*)chmodもchownもPC上ではあまり意味がありません。
#ファイルtest.txtファイルのユーザIDとグループIDを変更します。
my $k = chown 1,1,"test.txt";
print "$k";
●link
link ファイル1, ファイル2
ファイル1をファイル2にハードリンクします。
my $k = unlink("test.txt");
print "$k";
●unlink
unlink ファイルリスト
指定されたファイルを削除します。
#ファイルtest.txtを削除します。
my $k = unlink("test.txt");
print "$k";
結果
1
ファイルは削除されました。
●mkdir
mkdir ディレクトリ[, 権限]
指定された権限のディレクトリを作成します。権限は場合8進数表示。 省略すると0777で作成します。
#ディレクトリtestdirを作成。
my $k = mkdir "testdir", 0755;
print "$k";
結果
1
"testdir"ディレクトリが作成されました。
●rmdir
rmdir ディレクトリ
ディレクトリを削除します。削除するディレクトリの中にファイルが存在してはいけません。
my $k = rmdir("testdir");
print "$k";
結果
1
"testdir"ディレクトリが削除されました。
ディレクトリの中にファイルが存在すると削除され、あせん。エラーは表示されず、結果が0となります。
●readlink
readlink ファイル
ファイルからシンボリックリンクされたファイルの名前を返します。
my $k = readlink "test.txt";
print "$k";
●rename
rename ファイル1, ファイル2
ファイル1の名前をファイル2に変更する。
my $k = rename "test1.txt", "test2.txt";
print "$k";
結果
1
test1.txtはtest2.txtに変更されました。
●symlink
symlink ファイル1, ファイル2
ファイル1をファイル2にシンボリックリンクします。
my $k = symlink "test1.txt", "test2.txt";
print "$k";
●truncate
truncate ファイル, サイズ
ファイルの大きさを指定されたサイズに変更します。
my $k = truncate "test.txt", 10;
print "$k";
結果
1
変更された分、大きければスペースで埋められ、小さければ後ろから削除されます。
●utime
utime アクセス時刻, 更新時刻, ファイル
ファイルのアクセス時刻と更新時刻を変更します。 両時刻は数値。
#timeは現在時刻を取る関数。
my $now = time;
utime $now, $now, "test.pl";
エクスプローラからファイルを選択し、プロパティを見てみると、スクリプトを実行した前後で更新日時、アクセス日時は変更されていることが確認できます。
●stat,lstat
stat ファイル
lstat ファイル
ファイルに関する情報のリストを返します。ファイルの名がシンボリックリンクだった場合、
リンクが示す先のファイルではなく、リンクそのものの情報を返します。
各要素に名前でアクセスするためには、モジュールFile::statを利用します。
添字 | 名前 | 解説 |
---|---|---|
0 | dev | デバイスコード |
1 | ino | Inode番号 |
2 | mode | ファイルタイプとアクセスフラグ |
3 | nlink | ハードリンクの数 |
4 | uid | 所有者のユーザid |
5 | gid | 所有者のグループid |
6 | rdev | デバイスタイプ |
7 | size | ファイルサイズ(バイト単位) |
8 | atime | 最終参照時刻 |
9 | mtime | 最終更新時刻 |
10 | ctime | 最終状態変更時刻 |
11 | blksize | ファイルシステムのブロックサイズ |
12 | blocks | ファイルサイズ(ブロック単位) |
my @v = stat "test.pl";
for(my $i = 0; $i < 13; $i++) {
print "$i : $v[$i]\n";
}
結果
0 : 6←デバイスコード
1 : 0←Inode番号
2 : 33206← ファイルタイプとアクセスフラグ
3 : 1←ハードリンクの数
4 : 0←所有者のユーザid
5 : 0←所有者のグループid
6 : 6← デバイスタイプ
7 : 126←ファイルサイズ(バイト)
8 : 1534381148←最終参照時刻
9 : 1539233880←最終更新時刻
10 : 1534381148← 最終状態変更時刻
11 :←ファイルシステムのブロックサイズ
12 :←ファイルサイズ(ブロック)
今の所あまり役に立つ情報はありませんが・・・。
時刻を表している妙な数字は、「日付」のところで説明します。
File::statモジュールのstat関数を使ってみましょう。
use File::stat;
#このstat関数はFile::statモジュールの中のもの。
my $file = stat("test.pl");
#表の「名前」を指定して取り出す。
my $size = $file->size;
print "size : $size";
結果
size : 135
File::statモジュールはperl\lib\Fileディレクトリの下にstat.pmというファイルがあり、
これを指しています。時間があったら中を見て下さい。(絶対に中身を変更しないこと)