ファイルハンドルから次の文字を取得する
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))
としてしまうと、
getc
が 0
を読み取った時に 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 が便利かもしれません。