Perl-files
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, $!";
次の表は、さまざまなモードの可能な値を示しています
Sr.No. | Entities & Definition |
---|---|
1 |
< or r 読み取り専用アクセス |
2 |
> or w 作成、書き込み、切り捨て |
3 |
>> or a 書き込み、追加、作成 |
4 |
< or r 読み取りと書き込み |
5 |
> or w 読み取り、書き込み、作成、切り捨て |
6 |
>> or a 読み取り、書き込み、追加、および作成 |
Sysopen関数
*sysopen* 関数は、システム関数のパラメータとして提供されたパラメータを使用して、システムの* open()*関数を使用することを除いて、メインのオープン関数に似ています-
たとえば、更新のためにファイルを開くには、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の可能な値を示しています。
Sr.No. | Entities & Definition |
---|---|
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つの引数を取り、既存のファイルの名前を変更します。
既存のファイルを削除する
次に、 unlink 関数を使用してファイルfile1.txtを削除する方法を示す例を示します。
#!/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";
}
ここにファイルまたはディレクトリを確認できる機能のリストがあります-
Sr.No. | Operator & Definition |
---|---|
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またはグループIDで読み取り可能ですか? |
21 |
-s ファイルのサイズを返します。ゼロサイズ=空のファイル。 |
22 |
-t ファイルハンドルはTTY(端末)によって開かれていますか? |
23 |
-u ファイルにsetuidビットが設定されていますか? |
24 |
-w ファイルは有効なユーザーIDまたはグループIDで書き込み可能ですか? |
25 |
-x ファイルは有効なユーザーIDまたはグループIDで実行可能ですか? |
26 |
-z ファイルサイズはゼロですか? |