нашел, все ясно:

1: open( STDIN, '<', \$data ) делает 'require PerlIO::scalar' - т.е. находит 
этот PerlIO/scalar.pm и читает его черед fd(0). Ну
читает и слава богу.

2: while(<>) или для простоты readline читает из STDIN, но вот тут и бага - он 
читает не из STDIN а из libc.STDIN_FILENO который 0.
А он уж занят. Т.е. фикс видимо должен быть где-то в потрохах PerlIO::scalar 
чтобы он правильно переопределял Perl_tied_method("READLINE").

/dk


On Fri, Dec 09, 2011 at 12:36:23PM +0100, Dmitry Karasik wrote:
> > А про open я имел в виду, что при открытии STD* мы можем получить еще 
> > одно-два открытия файлов (тех самых PerlIO + PerlIO::scalar)
> 
> ну ессно потому что это баг, я в сырцах не рылся но я помню что open 
> открывающий
> скаляр как файл был сделан на базе PerlIO layers, и скорее всего где-то эта
> строчка "PerlIO" перекочевала туда куда не надо ...
> 
> /dk

-- 
Sincerely,
        Dmitry Karasik

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить