in reply to Can't open($newfh, $mode_layers, '&' . fileno($fh))

Looks like there's two issues here. One is that in the three-arg form of open, the '&' character goes at the end of the second argument, not the beginning of the third one. The proper syntax would be open($fd2, '+>>&', $fn); Your code as is opens a file called &3 with $fd2 pointing to it. The other is that, based on a quick test here, it seems that you cannot specify PerlIO layers when opening a filehandle this way. But binmode should be able to help with that.

Replies are listed 'Best First'.
Re^2: Can't open($newfh, $mode_layers, '&' . fileno($fh))
by renodino (Curate) on Feb 10, 2006 at 21:51 UTC
    OK, thnx for the pointers wrt '&' placement.

    However, testing binmode() seems to do some odd things; if I apply the layers of the original to the dup'ed handle, the layers stack, rather than replace:

    use PerlIO; my $fd; open($fd, '+>>:raw', 'somefile.data') || die $!; my $layers = ':' . join(':', PerlIO::get_layers($fd)); print "$layers\n"; # # this doesn't complain, but the layers aren't being properly applied # my $fd3; open($fd3, "+>>&", fileno($fd)) || die $!; binmode $fd3, $layers; print join(',', PerlIO::get_layers($fd3)), "\n";
    results in "unix,crlf,unix" as the reported layers for $fd3. I guess its possible scan and apply layers - but how do I remove them ? I tried using just "binmode $fd3;", and that still reports unix,crlf...

    And I'm still left in limbo wrt getting handle access modes on Win32...is there any Win32API solution to that ?