@kyanny's blog

My life. Opinions are my own.

STDIN を二度にわけて取得することってできないだろうか

#!/usr/local/bin/perl
use strict;
use warnings;

print q[
echo hoge
echo moe
];
#!/usr/local/bin/perl -l
use strict;
use warnings;

my @line = <STDIN>;
print @line;
warn "OK? [y/N]";
my $ret = <STDIN>;
unless ($ret =~ m/^y/i) {
    die;
}
print $ret;

こういうスクリプトが二つあって、以下のように実行した場合に、 [y/N] を尋ねるプロンプトが出て処理が止まって欲しい。

$ ./out.pl | ./stdin.pl

結果はこうなる

$ ./out.pl | ./stdin.pl

echo hoge
echo moe

OK? [y/N] at ./stdin.pl line 7, <STDIN> line 3.
Use of uninitialized value in pattern match (m//) at ./stdin.pl line 9, <STDIN> line 3.
Died at ./stdin.pl line 10, <STDIN> line 3.

なんか無理そうな気がしてきたな・・・。 seek STDIN 0,0 とか入れてみたけど変わらず。

追記

hiboma close STDIN; open STDIN, '<', '/dev/tty'; するとか // 正しい作法かどうかは謎です

http://b.hatena.ne.jp/hiboma/20090216#bookmark-12150302

の通りにやってみたら出来ました。ありがとうございます。 /dev/tty をオープンするとか、思いつかなかった。 /dev/なんちゃら、とかがあまりよくわかってない。