Perl入門 ≫ LESSON19 入出力関数
入出力関数
Perlでは、入出力で使用できる関数が用意されています。
●open:ファイルのオープン
open ファイルハンドル, モード, ファイル
open ファイルハンドル, モード+ファイル
ファイルを指定したモードでオープンし、ファイルハンドルと関連付けます。
このファイルハンドルを使用してファイルへのアクセスを行います。
ファイルハンドルは変数名と同じく自分で自由に付けます。
モードの一覧は前の「入出力」の項目で説明。
モードとファイル名を一緒に書く場合、二つは続けて書きます。
open関数は、オープンに成功すると真を、失敗すると偽を返します。
●close:ファイルクローズ
close ファイルハンドル
指定されたファイルハンドルをクローズします。
クローズすると、以後そのファイルハンドルを使ってアクセスはできません。
(同じファイルハンドル名で新たにopenすることは出来ます。)
openが成功した場合の処理で、必ずcloseを忘れずに書いて下さい。
●binmode:バイナリモード
binmode ファイルハンドル
指定されたファイルハンドルを通して読み書きされたデータに対して、改行変換を行いません。
open(FILE, "<test.gif") || die "file open error!";
binmode(FILE);
while(read (FILE, my $buf, 8* 2**10)) {
print;
}
close(FILE);
バイナリモードでファイルを読み込みます。
●read:読み込み
read ファイルハンドル, 変数, 長さ [, オフセット]
ファイルのオフセット目から指定した長さ(バイト)分を変数に格納します。
ファイルの最後を表すEOFでは0を、失敗した場合はundefを返します。
open(FILE, "<test.txt") || die "file open error!";
while(read (FILE, my $buf, 1)) {
print $buf;
}
close(FILE);
●seek:入力位置の移動
seek ファイルハンドル, オフセット, 基点
ファイルの中で、基点から数えたオフセット分(バイト)に入出力位置を移動します。
基点は下の表。
値で指定します。
オフセットをマイナスで指定すると、基点から逆方向に数えてオフセットします。
値 | 名前 | 解説 |
---|---|---|
00 | SEEK_SET | ファイルの先頭からのオフセット |
01 | SEEK_CUR | 現在の位置からのオフセット |
02 | SEEK_END | ファイルの末尾からのオフセット |
open(FILE, "<test.txt") || die "file open error!";
#ファイル末尾から8バイト目に移動
seek(FILE, -8, 02);
read (FILE, my $buf, 5);
print $buf;
close(FILE);
●getc:文字読み込み
getc ファイルハンドル
ファイルから次の一文字を読込んで返します。ファイルの末尾では空文字列を返します。
open(FILE, "<test.txt") || die "file open error!";
while(my $c = getc FILE) {
print $c;
}
close(FILE);
●print:出力
print [ファイルハンドル] 出力リスト
出力リストの内容を出力します。ファイルハンドルを省略すると、現在選択されている出力ハンドルに出力します。(大抵の場合STDOUT(標準出力))
#入力ファイルと出力ファイルを用意
open(INFILE, "<test.txt") || die "Input file open error!";
open(OUTFILE, ">test2.txt") || die "Output file open error!";
while(my $v = <INFILE>) {
print OUTFILE $v;
}
close(INFILE);
close(OUTFILE);
●sprintf:フォーマット
sprintf フォーマット, 出力リスト
与えられたフォーマットにしたがって出力リストを整形した文字列を返します。
フォーマットの詳細については下の方で説明。
#最初の%s(文字列を表す)部分にリストの最初の"aaa"、
#次の%d(数値を表す)部分にリストの次の要素1を整形代入
my $v = sprintf("test %s %d.\n", "aaa", 1);
print "$v";
結果
test aaa 1.
●printf:フォーマット出力
printf [ファイルハンドル] フォーマット、出力リスト
”print ファイルハンドル sprintf 出力リスト” と同等。
フォーマットした整形済み出力リストを出力します。
printf("test %s %d.\n", "aaa", 1);
●eof:ファイルの最後
eof ファイルハンドル
eof()
eof
ファイルハンドルに対する読み込みがEOF(ファイル終了)かどうかを返します。
ファイルがオープンされていなければ真を返します。
eof()は、コマンド行で与えられた各ファイルについてのEOF情報を返します。
eofは、最後に読込んだファイルについてのEOF情報を返します。
open(FILE, "<test.txt") || die "file open error!";
while(<FILE>) {
if(eof FILE) { print 1;}
else { print 0 };
}
close(FILE);
ファイルの行数分0が表示され、最後だけ1が表示されます。
フォーマット
perlでは以下の変換書式指定文字に従って、値やリストを整形することができます。
%% | パーセント文字 |
---|---|
%b | 符号なし数値(バイナリ) |
%c | 数値に対応する文字 |
%d, %i | 符号付きの整数値 |
%e,%E | 浮動小数点数(指数形式) |
%f | 浮動小数点数(固定小数点形式) |
%g,%G | 浮動小数点数(%eか%fの形式) |
%n | その時点までに整形された文字数を引数リストに挿入する |
%o | 符号なし整数値(8進数) |
%p | ポインタ(16進数表記のアドレス) |
%s | 文字列 |
%u | 符号なし整数値(10数) |
%x,%X | 符号なし整数値(16進) |
#10進数字を16進数字に整形
printf("%x\n", 100);
#数値を文字列として整形するので、そこに+1をしても0+1と解釈される
my $v = sprintf("%c\n", 100);
$v += 1;
print $v;
結果
64
1
以下のフラグを%と書式指定文字の間に置くことが出来ます。
スペース | 正の値の前に空白を挿入 |
---|---|
+ | 正の値の前にプラス記号を挿入 |
- | フィールド内左寄せ |
0 | 右寄せ時に、ゼロで埋める |
# | 0以外の8進数の前に”0”を、 0以外の16進数の前に”0x”を置く |
数字 | 最小フィールド幅 |
.数字 | 浮動小数値の場合、小数点の後の数字の数 文字列の場合、最大フィールド長 整数値の場合、最小フィールド長 |
h | C言語の仕様に従って整数値を”short”または”unsigned short”として扱う |
l | C言語の仕様に従って整数値を”long”または”unsigned long”として扱う |
ll,L,q | 整数値を”quad”(64ビット)データとして扱う |
v | 文字列を連続する数値として出力する。d,o,xと共に使用 |
V | Perl形式で整数値を解釈する |
#数値を3桁ので表現。右寄せ時に余った桁を0で埋める
printf("%03d\n", 2);
#プラス記号を入れる
printf("%+d %+d\n", 2 , -1);
結果
002
+2 -1