Perl は、ファイル ハンドル タイプと呼ばれる変数を使用してファイルを操作します。
ファイルからのデータの読み取りまたは書き込みには、ファイル ハンドルが必要です。
ファイル ハンドルは I/O 接続の名前です。
Perl には、STDIN、STDOUT、および STDERR という 3 つのファイル ハンドルがあり、それぞれ標準入力、標準出力、および標準エラー出力を表します。
次の方法を使用して、Perl でファイルを開くことができます。
ファイルハンドルを開く、EXPROファイルハンドル、ファイル名、モードを開く、PERMSsysファイルハンドル、ファイル名、モードを開く
パラメータの説明:
FILEHANDLE: ファイル ハンドル。一意のファイル識別子を保存するために使用されます。
EXPR: ファイル名とファイル アクセス タイプで構成される式。
MODE: ファイルアクセスタイプ。
PERMS:アクセス許可ビット(許可ビット)。
次のコードでは、open 関数を使用してファイル file.txt を読み取り専用モード (<) で開きます。
open(DATA, "<file.txt");
< は読み取り専用モードを示します。
コード内の DATA は、ファイルを読み取るために使用されるファイル ハンドルです。次の例では、ファイルを開いてファイルの内容を出力します。
次のコードは、書き込み用にファイル file.txt を開きます ( > )。
open(DATA, ">file.txt") または die "file.txt ファイルを開けません。$!";
>書き込み方法を示します。
読み取りと書き込みのためにファイルを開く必要がある場合は、> または < 文字の前に + 記号を追加できます。
open(DATA, "+<file.txt"); または die "file.txt ファイルを開けません。$!";
この方法では、ファイルの元の内容は削除されません。削除する場合の形式は次のとおりです。
open DATA, "+>file.txt" または die "file.txt ファイルを開けません。$!";
ファイルにデータを追加する場合は、データを追加する前にファイルを追加モードで開くだけです。
open(DATA,">>file.txt") || die "file.txt ファイルを開けません。$!";
>> は、既存のファイルの末尾にデータを追加することを意味します。追加するファイルの内容を読み取る必要がある場合は、+ 記号を追加できます。
open(DATA,"+>>file.txt") || die "file.txt ファイルを開けません。$!";
次の表に、さまざまなアクセス モードを示します。
| モデル | 説明する |
|---|---|
| < または r | 読み取り専用モードで開き、ファイル ポインタをファイル ヘッダーにポイントします。 |
| >とかw | 書き込みモードで開き、ファイル ポインタをファイル ヘッダーにポイントし、ファイル サイズをゼロに切り捨てます。ファイルが存在しない場合は、作成してみてください。 |
| >> または | 書き込みモードで開き、ファイル ポインタをファイルの末尾に指します。ファイルが存在しない場合は、作成してみてください。 |
| +< または r+ | 読み取り/書き込みモードで開き、ファイル ポインタをファイル ヘッダーにポイントします。 |
| +> または w+ | 読み取り/書き込みモードで開き、ファイル ポインターをファイル ヘッダーにポイントし、ファイル サイズをゼロに切り捨てます。ファイルが存在しない場合は、作成してみてください。 |
| +>> または a+ | 読み取り/書き込みモードで開き、ファイル ポインタをファイルの末尾に指します。ファイルが存在しない場合は、作成してみてください。 |
sysopen関数は、パラメーターの形式が異なることを除いて、open 関数に似ています。
次の例では、読み取りと書き込みのためにファイルを開きます (+<ファイル名)。
sysopen(DATA, "file.txt", O_RDWR);
更新する前にファイルをクリアする必要がある場合の書き込み方法は次のとおりです。
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
O_CREAT を使用して新しいファイルを作成できます。O_WRONLY は書き込み専用モード、O_RDONLY は読み取り専用モードです。
PERMSパラメータは 8 進数の属性値で、ファイル作成後のアクセス許可を示します。デフォルトは0x666です。
次の表に、可能なモード値を示します。
| モデル | 説明する |
|---|---|
| O_RDWR | 読み取り/書き込みモードで開き、ファイル ポインタをファイル ヘッダーにポイントします。 |
| O_RDONLY | 読み取り専用モードで開き、ファイル ポインタをファイル ヘッダーにポイントします。 |
| O_WRONLY | 書き込みモードで開き、ファイル ポインタをファイル ヘッダーにポイントし、ファイル サイズをゼロに切り捨てます。ファイルが存在しない場合は、作成してみてください。 |
| O_CREAT | ファイルの作成 |
| O_APPEND | ファイルを追加する |
| O_TRUNC | ファイルサイズをゼロに切り詰める |
| O_EXCL | O_CREAT を使用すると、ファイルが存在する場合、エラー メッセージが返されます。ファイルが存在するかどうかをテストできます。 |
| O_NONBLOCK | ノンブロッキング I/O により、操作はブロックされることなく成功するか、ただちにエラーを返すことができます。 |
ファイルを使用した後、ファイルを閉じて、ファイル ハンドルに関連付けられた入力バッファと出力バッファを更新する必要があります。ファイルを閉じるための構文は次のとおりです。
閉じるファイルハンドル閉じる
FILEHANDLE は指定されたファイル ハンドルで、正常に閉じられた場合は true を返します。
close(DATA) || die "ファイルを閉じることができません";
ファイルへの情報の読み取りおよび書き込みには、いくつかの異なる方法があります。
開いているファイル ハンドルから情報を読み取る主な方法は、<FILEHANDLE> 演算子です。スカラーコンテキストでは、ファイルハンドルから単一行を返します。例えば:
<FILEHANDLE> 演算子を使用すると、ファイル ハンドル内の各行のリストが返されます。たとえば、すべての行を配列にインポートできます。
次の内容を含む import.txt ファイルの作成を実装します。
$猫インポート.txt 123
import.txt を読み、各行を @lines 配列に入力します。
上記のプログラムを実行すると、出力結果は次のようになります。
123
xgetc 関数は、指定された FILEHANDLE から単一の文字を返します。指定されていない場合は STDIN を返します。
getcファイルハンドルgetc
エラーが発生した場合、またはファイル ハンドルがファイルの末尾にある場合は、undef が返されます。
read 関数は、バッファーのファイル ハンドルから情報を読み取るために使用されます。
この関数は、ファイルからバイナリ データを読み取るために使用されます。
ファイルハンドル、スカラー、長さ、オフセット読み取り ファイルハンドル、スカラー、長さ
パラメータの説明:
FILEHANDLE: ファイル ハンドル。一意のファイル識別子を保存するために使用されます。
SCALAR: 結果を格納します。OFFSET が指定されていない場合、データは SCALAR の先頭に配置されます。それ以外の場合、データは SCALAR の OFFSET バイトの後に配置されます。
LENGTH: 読み取られたコンテンツの長さ。
オフセット: オフセット。
読み取りが成功した場合は読み取られたバイト数を返し、ファイルの終わりに達した場合は 0 を返し、エラーが発生した場合は undef を返します。
ファイル ハンドルから情報を読み取るすべての関数について、バックエンドの主な書き込み関数は print です。
ファイルハンドルリスト印刷リスト印刷
プログラムの実行結果は、ファイル ハンドルと print 関数を使用して出力デバイス (STDOUT: 標準出力) に送信できます。次に例を示します。
"Hello World!n" を印刷します。
次の例では、既存のファイル file1.txt を開き、その各行を読み取り、ファイル file2.txt に書き込みます。
次の例では、既存のファイル file1.txt の名前を file2.txt に変更し、指定されたディレクトリは /usr/codercto/test/ の下にあります。
#!/usr/bin/perlrename ("/usr/codercto/test/file1.txt", "/usr/codercto/test/file2.txt" );renames関数は 2 つのパラメータのみを受け取り、既存のファイルの名前のみを変更します。
次の例は、 unlink関数を使用してファイルを削除する方法を示しています。
Tell関数を使用してファイルの場所を取得し、 seek関数を使用してファイル内の場所を指定できます。
ファイルの場所を取得するには、tell 関数が使用されます。
伝える FILEHANDLE伝える
FILEHANDLE が指定されている場合、この関数はファイル ポインターの位置をバイト単位で返します。指定しない場合は、デフォルトで選択されているファイル ハンドルを返します。
Seek() 関数は、ファイル ハンドルを介してファイル読み取り/書き込みポインタを移動することによってファイルの読み取りまたは書き込みを行い、バイト単位で読み取りと書き込みを行います。
ファイルハンドル、位置、場所をシークします
パラメータの説明:
FILEHANDLE: ファイル ハンドル。一意のファイル識別子を保存するために使用されます。
POSITION: ファイル ハンドル (読み取りおよび書き込み位置ポインター) によって移動されるバイト数を示します。
WHENCE: ファイル ハンドル (読み取り/書き込み位置ポインター) が移動を開始する開始位置を示します。指定可能な値は、ファイルの先頭、現在位置、および末尾を示します。それぞれファイルします。
次の例では、ファイルの先頭から 256 バイトを読み取ります。
DATA、256、0をシークします。
Perl のファイル操作では、最初にファイルが存在するかどうか、読み書きできるかどうかなどをテストすることもできます。
次のように、まず file1.txt ファイルを作成します。
$ cat file1.txt www.codercto.com
上記のプログラムを実行すると、出力結果は次のようになります。
file1.txt 情報: テキスト ファイル、15 バイト
ファイル テスト演算子を次の表に示します。
| オペレーター | 説明する |
|---|---|
| -A | ファイルが最後にアクセスされた時刻(単位:日) |
| -B | バイナリファイルですか? |
| -C | ファイル(inode)インデックスノード変更時間(単位:日) |
| -M | ファイルが最後に変更された時刻(単位:日) |
| -O | ファイルは実際の UID によって所有されています |
| -R | ファイルまたはディレクトリは実際の UID/GID で読み取ることができます |
| -S | ソケット(ソケット)用 |
| -T | テキストファイルですか? |
| -W | ファイルまたはディレクトリは実際の UID/GID を使用して書き込むことができます |
| -X | ファイルまたはディレクトリは実際の UID/GID で実行可能 |
| -b | ブロックスペシャル (特殊ブロック) ファイル (マウントされたディスクなど) の場合 |
| -c | キャラクタスペシャル (特殊文字) ファイル (I/O デバイスなど) の場合 |
| -d | ディレクトリ用 |
| -e | ファイルまたはディレクトリ名が存在します |
| -f | 通常のファイルの場合 |
| -g | ファイルまたはディレクトリに setgid 属性がある |
| -k | ファイルまたはディレクトリにはスティッキー ビットが設定されています |
| -l | シンボリックリンクの場合 |
| -o | ファイルは有効な UID によって所有されています |
| -p | ファイルは名前付きパイプ (FIFO) です |
| -r | 有効な UID/GID でファイルを読み取ることができます |
| -s | ファイルまたはディレクトリは存在しますが、0 ではありません (バイト数を返します) |
| -t | ファイル ハンドルは TTY (システム関数 isatty() の戻り結果。このテストはファイル名には使用できません) |
| -u | ファイルまたはディレクトリに setuid 属性がある |
| -w | 有効な UID/GID を使用してファイルに書き込むことができます |
| -x | ファイルは有効な UID/GID で実行できます |
| -z | ファイルが存在し、サイズが 0 (ディレクトリは常に false)、つまり空のファイルかどうか。 |