The :pending layer (used in PerlIO_unread)
PerlIO_unread()はよく考えるとかなり異様な挙動をする。何バイトまでなら安全に戻せるのか,あるいは戻した文字列はどこへ行くのか,などの疑問が起きて当然だ。
結論からいえば,これらは:pendingという内部レイヤーを用いて実装されているため,何バイトでも安全に読み戻せる。まったく読んでいない文字列を戻すことすらできる。
#!perl -w use feature 'say'; use strict; use IO::Handle::unread; # available via CPAN *STDIN->unread("Hello, world!\n"); say join(",", PerlIO::get_layers(*STDIN)); # unix,perlio,pending say scalar <STDIN>; # => Hello, world! __END__
なお,新しいレイヤーをいちいち割り当てるのは非効率なので,実際には読み込みバッファに余裕があるときはそのバッファを使う。したがって,普通のgetc()として使う分には:pendingが使われることはない。