|
ファイル
ファイルを操作する関数として以下のものがあります。
関数 | 構文 | 説明 |
open | open(ファイルハンドル,ファイル) | ファイルを開きます。 |
open (ファイルハンドル, "ファイル") open (ファイルハンドル, "< ファイル") | 読込み |
open (ファイルハンドル, "> ファイル") | 書込み |
open (ファイルハンドル, ">> ファイル") | 追記 |
open (ファイルハンドル, "+> ファイル") open (ファイルハンドル, "+< ファイル") | 読書き |
open (ファイルハンドル, "| コマンド") | パイプ出力用 |
open (ファイルハンドル, "コマンド |") | パイプ入力用 |
close | close(ファイルハンドル) | 開いたファイルを閉じます。 |
| open(ファイルハンドル,"> ファイル") open(ファイルハンドル,"+> ファイル") | ファイルを生成します。 (書込みか読書きで開く) |
unlink | unlink(ファイル) | ファイルを削除します。 |
rename | rename "変更前", "変更後" | ファイル名を変更します。 |
ディレクトリと同じ形式の表にまとめてみました。
ファイルの方もopenとcloseはセットで使います。
readdir のような関数はなくて、単純に @x=<ファイルハンドル>、$x=<ファイルハンドル>
のように = で代入できます。ファイルハンドルを<>ではさみます。
例、
ギラファノコギリクワガタ、
グランディスオオクワガタ、
エレファスゾウカブト、
と書いたファイルを test.txt と言う名前で同じディレクトリに保存。
(C:\Program Files\Apache Group\Apache2\cgi-bin)
#!c:/perl/bin/perl
open(IN,"test.txt");
@file = <IN>;
close(IN);
print "Content-type: text/html; charset=Shift_JIS\n\n";
print @file;
↓
ギラファノコギリクワガタ、グランディスオオクワガタ、エレファスゾウカブト、
|
ファイルハンドルもディレクトリハンドルと同じく、「今開いているファイル」を区
別するために一時的に関連付けられる名前です。変数みたいな使い方をします。$はいり
ませんが習慣的に大文字を使います。
いったん閉じたあとで同じ名前を使いまわしてもよいです。
プログラムごとに好きな名前を付けてかまいません。
以下のファイルハンドルは特殊な意味を持つので、これと同じ名前は避けましょう。
公開するHP用に組むCGIでは使わないと思う。
関数 | 構文 | 説明 |
STDIN | 標準入力 | パイプ、リダイレクト、キーボードから。 |
STDOUT | 標準出力 | パイプ、リダイレクト、モニターへ。 |
STDERR | 標準エラー | エラー時。 |
パーミッションやオーナーの設定もディレクトリと同じようにします。
ファイル演算子
ファイルやディレクトリの有無や、それがどういうものかを調べることができます。
例えば、test.cgiと同ディレクトリにtext.txtというファイルが有る場合。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
if (-e "test.txt"){
print "ありですぅ";
} else {
print "なしですぅ";
}
↓
ありですぅ
|
となります。
-e というのは、ファイルの有無を判断する演算子で、ファイルやディレクトリが存在
すれば1を返します。
というわけで、ファイル演算子一覧表。
演算子 | ……であれば1(真、true) |
-w | 書き込み可能 |
-x | 実行可能 |
-o | 実行ユーザーと所有者が同一 |
-R | 実行ユーザーでなく、実ユーザーで読み込み可能 |
-W | 実行ユーザーでなく、実ユーザーで書き込み可能 |
-X | 実行ユーザーでなく、実ユーザーで実行可能 |
-O | 実行ユーザーでなく、実ユーザーのもの |
-e | 存在すれば |
-z | 存在し、サイズが 0 |
-s | ファイルサイズを返す |
-f | 通常ファイル |
-d | ディレクトリ |
-l | シンボリックリンク |
-p | 名前付きパイプ |
-S | ソケット |
-T | テキストファイル |
-B | バイナリファイル |
-b | ブロック型の特殊ファイル |
-c | キャラクタ型の特殊ファイル |
-u | setuid ビットがセットされていれば |
-g | setgif ビットがセットされていれば |
-k | sticky ビットがセットされていれば |
-M | 最終更新時刻からの日数 |
-A | 最終アクセス時刻からの日数 |
-C | 最終 i ノード変更時刻からの日数 |
-t | ファイルハンドルが tty としてオープンされていれば |
-s -M -A -C は1ではなく、それぞれの値を返します。
なのでIF文よりも $filesize = (-s "text.txt"); というようにに、変数に代入する
ような使い方の方が多くなると思います。
例)
# 0.1日より古いファイル(こういう名前付けルールの→/[a-f0-9]{32}$/o)を削除する
my $dir = '/home/hoge/tmp';
unlink grep { -M > 0.1 } grep { /[a-f0-9]{32}$/o } <$dir/*>;
|
|
|
|