Perl-ファイルI / O
ファイルの処理の基本は単純です。 filehandle 外部エンティティ(通常はファイル)を使用してから、Perl内のさまざまな演算子と関数を使用して、ファイルハンドルに関連付けられたデータストリーム内に格納されているデータを読み取って更新します。
ファイルハンドルは、物理ファイルを名前に関連付ける名前付きの内部Perl構造です。すべてのファイルハンドルは読み取り/書き込みアクセスが可能であるため、ファイルハンドルに関連付けられている任意のファイルまたはデバイスから読み取りおよび更新できます。ただし、ファイルハンドルを関連付ける場合は、ファイルハンドルを開くモードを指定できます。
3つの基本的なファイルハンドルは- STDIN、 STDOUT、および STDERR, これは、それぞれ標準入力、標準出力、および標準エラーデバイスを表します。
ファイルを開いたり閉じたりする
Perlで新規または既存のファイルを開くために使用できる複数の形式の次の2つの関数があります。
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
ここで、FILEHANDLEは、によって返されるファイルハンドルです。 open 関数とEXPRは、ファイル名とファイルを開くモードを持つ式です。
オープン機能
開く構文は次のとおりです file.txt読み取り専用モード。ここで<記号未満は、ファイルを読み取り専用モードで開く必要があることを示します。
open(DATA, "<file.txt");
ここで、DATAはファイルハンドルであり、ファイルの読み取りに使用されます。これは、ファイルを開き、そのコンテンツを画面に印刷する例です。
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";
while(<DATA>) {
print "$_";
}
以下は、file.txtを書き込みモードで開くための構文です。ここで>未満の記号は、ファイルを書き込みモードで開く必要があることを示します。
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
この例では、書き込み用に開く前に実際にファイルを切り捨て(空にし)ますが、これは望ましい効果ではない可能性があります。読み取りと書き込みのためにファイルを開きたい場合は、>または<文字の前にプラス記号を付けることができます。
たとえば、ファイルを切り捨てずに更新用に開くには-
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
最初にファイルを切り捨てる-
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
追加モードでファイルを開くことができます。このモードでは、書き込みポイントはファイルの終わりに設定されます。
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
ダブル>>は、追加するファイルを開き、ファイルポインタを最後に配置して、情報の追加をすぐに開始できるようにします。ただし、その前にプラス記号を付けないと、そこから読み取ることはできません-
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
以下は、さまざまなモードの可能な値を示す表です。
シニア番号 | エンティティと定義 |
---|---|
1 | < or r 読み取り専用アクセス |
2 | > or w 作成、書き込み、および切り捨て |
3 | >> or a 書き込み、追加、作成 |
4 | +< or r+ 読み取りと書き込み |
5 | +> or w+ 読み取り、書き込み、作成、および切り捨て |
6 | +>> or a+ 読み取り、書き込み、追加、および作成 |
Sysopen関数
ザ・ sysopen 関数は、システムを使用することを除いて、メインのオープン関数に似ています open() 提供されたパラメータをシステム関数のパラメータとして使用する関数-
たとえば、更新用にファイルを開くには、 +<filename オープンからのフォーマット−
sysopen(DATA, "file.txt", O_RDWR);
または、更新する前にファイルを切り捨てる-
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
O_CREATを使用して新しいファイルを作成し、O_WRONLY-を使用してファイルを書き込み専用モードで開き、O_RDONLY-を使用してファイルを読み取り専用モードで開くことができます。
ザ・ PERMS引数は、ファイルを作成する必要がある場合に、指定されたファイルのファイル権限を指定します。デフォルトでは0x666。
以下は、MODEの可能な値を示す表です。
シニア番号 | エンティティと定義 |
---|---|
1 | O_RDWR 読み書き |
2 | O_RDONLY 読み取り専用 |
3 | O_WRONLY 書き込みのみ |
4 | O_CREAT ファイルを作成する |
5 | O_APPEND ファイルを追加する |
6 | O_TRUNC ファイルを切り捨てます |
7 | O_EXCL ファイルがすでに存在する場合は停止します |
8 | O_NONBLOCK ノンブロッキングユーザビリティ |
クローズ機能
ファイルハンドルを閉じて、対応するファイルからファイルハンドルの関連付けを解除するには、 close関数。これにより、ファイルハンドルのバッファがフラッシュされ、システムのファイル記述子が閉じられます。
close FILEHANDLE
close
FILEHANDLEが指定されていない場合は、現在選択されているファイルハンドルを閉じます。バッファを正常にフラッシュしてファイルを閉じることができた場合にのみtrueを返します。
close(DATA) || die "Couldn't close file properly";
ファイルの読み取りと書き込み
ファイルハンドルを開いたら、情報の読み取りと書き込みができるようにする必要があります。データの読み取りとファイルへの書き込みには、さまざまな方法があります。
<FILEHANDL>演算子
開いているファイルハンドルから情報を読み取る主な方法は、<FILEHANDLE>演算子です。スカラーコンテキストでは、ファイルハンドルから1行を返します。例-
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
リストコンテキストで<FILEHANDLE>演算子を使用すると、指定されたファイルハンドルから行のリストが返されます。たとえば、ファイルから配列にすべての行をインポートするには-
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
getc関数
getc関数は、指定されたFILEHANDLEから単一の文字を返します。指定されていない場合はSTDINを返します-
getc FILEHANDLE
getc
エラーが発生した場合、またはファイルハンドルがファイルの終わりにある場合は、代わりにundefが返されます。
関数を読む
read関数は、バッファリングされたファイルハンドルから情報のブロックを読み取ります。この関数は、ファイルからバイナリデータを読み取るために使用されます。
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
読み取られるデータの長さはLENGTHによって定義され、OFFSETが指定されていない場合、データはSCALARの先頭に配置されます。それ以外の場合、データはSCALARのOFFSETバイトの後に配置されます。この関数は、成功時に読み取られたバイト数、ファイルの終わりにゼロ、またはエラーがあった場合はundefを返します。
印刷機能
ファイルハンドルから情報を読み取るために使用されるすべての異なるメソッドの場合、情報を書き戻すための主な関数は印刷関数です。
print FILEHANDLE LIST
print LIST
print
print関数は、LISTの評価値をFILEHANDLEまたは現在の出力ファイルハンドル(デフォルトではSTDOUT)に出力します。例-
print "Hello World!\n";
ファイルのコピー
これは、既存のファイルfile1.txtを開き、それを1行ずつ読み取り、別のコピーファイルfile2.txtを生成する例です。
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
ファイルの名前を変更する
これは、ファイルfile1.txtの名前をfile2.txtに変更する方法を示す例です。ファイルが/ usr / testディレクトリにあると仮定します。
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
この機能 renames 2つの引数を取り、既存のファイルの名前を変更するだけです。
既存のファイルを削除する
これは、を使用してファイルfile1.txtを削除する方法を示す例です。 unlink 関数。
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
ファイル内の配置
あなたはに使用することができます tell ファイルの現在位置を知る関数と seek ファイル内の特定の位置を指す関数。
関数に伝える
最初の要件は、ファイル内の位置を見つけることです。これは、tell関数を使用して行います-
tell FILEHANDLE
tell
これは、指定されている場合はFILEHANDLE内のファイルポインタの位置をバイト単位で返し、何も指定されていない場合は現在のデフォルトで選択されているファイルハンドルを返します。
シーク機能
シーク関数は、ファイルポインタをファイル内の指定されたバイト数に配置します-
seek FILEHANDLE, POSITION, WHENCE
この関数はfseekシステム関数を使用しており、開始位置、終了位置、現在位置の3つの異なるポイントに対して同じ位置を設定できます。これを行うには、WHENCEの値を指定します。
ゼロは、ファイルの先頭を基準にした位置を設定します。たとえば、この行はファイルポインタをファイルの256番目のバイトに設定します。
seek DATA, 256, 0;
ファイル情報
-Xテストと総称される一連のテスト演算子を使用して、Perl内で特定の機能を非常に迅速にテストできます。たとえば、ファイルに対するさまざまなアクセス許可のクイックテストを実行するには、次のようなスクリプトを使用できます。
#/usr/bin/perl
my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
push @description, 'binary' if (-B _);
push @description, 'a socket' if (-S _);
push @description, 'a text file' if (-T _);
push @description, 'a block special file' if (-b _);
push @description, 'a character special file' if (-c _);
push @description, 'a directory' if (-d _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
これがファイルやディレクトリをチェックできる機能のリストです-
シニア番号 | 演算子と定義 |
---|---|
1 | -A スクリプトの開始時間からファイルの最終アクセス時間を引いた日数。 |
2 | -B バイナリファイルですか? |
3 | -C スクリプトの開始時間からファイルの最後のiノード変更時間を引いた日数。 |
3 | -M スクリプトの開始時間からファイルの変更時間を引いた日数。 |
4 | -O ファイルは実際のユーザーIDによって所有されていますか? |
5 | -R ファイルは実際のユーザーIDまたは実際のグループで読み取り可能ですか? |
6 | -S ファイルはソケットですか? |
7 | -T テキストファイルですか? |
8 | -W ファイルは実際のユーザーIDまたは実際のグループで書き込み可能ですか? |
9 | -X ファイルは実際のユーザーIDまたは実際のグループで実行可能ですか? |
10 | -b ブロック特殊ファイルですか? |
11 | -c キャラクタースペシャルファイルですか? |
12 | -d ファイルはディレクトリですか? |
13 | -e ファイルは存在しますか? |
14 | -f プレーンファイルですか? |
15 | -g ファイルにはsetgidビットが設定されていますか? |
16 | -k ファイルにスティッキービットが設定されていますか? |
17 | -l ファイルはシンボリックリンクですか? |
18 | -o ファイルは実効ユーザーIDによって所有されていますか? |
19 | -p ファイルは名前付きパイプですか? |
20 | -r ファイルは有効なユーザーまたはグループIDで読み取り可能ですか? |
21 | -s ファイルのサイズを返します。ゼロサイズ=空のファイル。 |
22 | -t ファイルハンドルはTTY(ターミナル)によって開かれていますか? |
23 | -u ファイルにはsetuidビットが設定されていますか? |
24 | -w ファイルは有効なユーザーまたはグループIDで書き込み可能ですか? |
25 | -x ファイルは有効なユーザーまたはグループIDで実行可能ですか? |
26 | -z ファイルサイズはゼロですか? |