|
|

ファイル

ファイルを操作する関数として以下のものがあります。
| 関数 | 構文 | 説明 |
| 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/*>;
|
|
|
|