getc

ファイルハンドルから次の文字を取得する

構文

解説

FILEHANDLE の入力から次の文字を取得して返します。 ファイルの最後やエラーの場合は undef を返します (エラーは $! にセットされます)。 次のサンプルコードは 1234056789 と記述されたテキストファイルをオープンし、 getc を使って一文字ずつ取り出して出力します。

open my $fh, '<', './sample.txt'; # "1234056789"
while(defined (my $char = getc($fh))) {
    print $char;
}

while の条件式で、getc から得られた文字を defined で未定義値かどうかを評価している点に注目してください。 これによって、期待通り、1234056789 と出力されます。 もし while(my $char = getc($fh)) としてしまうと、 getc0 を読み取った時に while が終了してしまいます。

日本語のようなマルチバイト文字を扱いたい場合は、ファイルを utf8 モードでオープンしてください。

binmode STDOUT, ":utf8";

open my $fh, '<:utf8', './sample.txt'; # "あいうえお"
while(defined (my $char = getc($fh))) {
    print $char;
}

こうすることで、日本語であろうが getc は 1 文字を取り出してくれるようになります。 もしファイルを utf8 モードでオープンしなかった場合は、1 文字ではなく 1 バイトを取り出してしまい、 取り出された値は文字として成り立ちませんので注意してください。

FILEHANDLE が省略されたら STDIN が適用されます。 これは主にターミナルやシェルからのキー入力を待ち受ける際に使われます。

my $char = getc;
print $char, "\n";

ただし、あまり実用的とは言えません。 というのも、getc はシェルでエンターキーが入力されるまで待ち受けてしまうからです。 また、当然ではありますが、仮に複数の文字を入力してからエンターキーを押すと、最初の 1 文字しか取り出せません。 もしシェルの対話型のスクリプトを作りたいなら、 Term::ReadKey が便利かもしれません。