in reply to Closing a filehandle in ":unix" layer doesn't work on Win32

Adding a unix layer makes no sense. I suspect both the existing unix layer and the one you add are trying to close the handle. Of course, only one will succeed. Do you have the problem if you use the following without binmode?

$fh->open("<:unix $filepath")

I would never use that, though. The following is the same, but provides buffering:

$fh->open("<:perlio $filepath")

The best solution is probably the following, though.

$fh->open("< $filepath"); binmode($fh);

Although I'd write it as

open(my $fh, '<', $filepath); binmode($fh);

Replies are listed 'Best First'.
Re^2: Closing a filehandle in ":unix" layer doesn't work on Win32
by rovf (Priest) on Mar 29, 2011 at 08:30 UTC
    Adding a unix layer makes no sense.
    I guess I was misusing the "layer" feature. Maybe you can enlighten me here:

    My reasoning about using the :unix layer was the following: By default (on a Windows host), Perl translates CRLF to \n when reading a file. In my case, however, the text file was created on a Unix platform with LF line endings. Hence, I thought that using the :unix layer, would have the effect of "recognizing" the proper endings. In particular, if the file to be read would contain by chance a CR right in front of a LF, this CR should also be returned to my application (i.e. CR should be treated just like any other character, but LF should be recognized as line delimiter).

    I suspect both the existing unix layer and the one you add are trying to close the handle. Of course, only one will succeed.

    This would not explain my problem, because if at least one of the 'close' would succeed, the handle would be closed afterwards. However, in my case the problem was the (Windows-)Handle was still *open* afterwards. Maybe it works the other way around: When switching to :unix layer, an additional (Windows-)handle was created, and the close operation closed only one, leaving the other open?

    The best solution is probably the following, though....

    If I understand right, using just binmode without argument is equivalent to specifying the :raw layer. This works indeed, and I think this is the solution I am going to use.

    -- 
    Ronald Fischer <ynnor@mm.st>

      Hence, I thought that using the :unix layer, would have the effect of "recognizing" the proper endings

      The key word was "adding". You were causing your handle to have layers :unix:crlf:unix.

      Furthermore, :unix does not refer to file formats. See PerlIO for definitions of the layers.

      If I understand right, using just binmode without argument is equivalent to specifying the :raw layer.

      binmode without argument is not currently equivalent to specifying :raw, because :raw doesn't currently behave as documented. You want the documented behaviour, so you want binmode without arguments.

      see perlio/binmode,
      :unix Lowest level layer which provides basic PerlIO operations in terms of UNIX/POSIX numeric file descriptor calls (open(), read(), write(), lseek(), close()).
      Also see this program, the results are for a win32 machine, and yes, those are unix perlio layers you see