in reply to Using binmode on ARGV filehandle?

I have nothing to add at this time to Re: binmode and sysread on <> (open.pm), but it and the thread that it is in might be of interest to you. I think that route is the proper way to fix this long-standing problem. A prior thread (Re: binmode for @ARGV (open.pm)) gives some insights into what I was trying to do and why.

- tye        

  • Comment on Re: Using binmode on ARGV filehandle? (open.pm)

Replies are listed 'Best First'.
Re^2: Using binmode on ARGV filehandle? (open.pm)
by graff (Chancellor) on Jun 02, 2006 at 22:29 UTC
    Thanks -- those are very helpful links. I found out from reading those that using the PERLIO environment variable does in fact provide the desired effect. For example, this script:
    #!/usr/bin/perl -w binmode STDOUT, ":encoding(utf16)"; while (<>) { print; }
    will correctly convert utf8 input to utf16 output, whether reading from STDIN or a list of one or more files in @ARGV, when I run it like this:
    $ export PERLIO=:utf8 $ myscript *.utf8 ## works the same as: cat *.utf8 | myscript
    Alas, if I just put  $ENV{PERLIO} = ":utf8"; into the script itself, this doesn't work. So to really free my script from undesirable environment dependencies, I could just make a wrapper script that sets $ENV{PERLIO}, then execs the actual filter script with @ARGV. Not exactly pretty, but not as ugly as other alternatives.

      You could use the same trick we use for fooling dynaloader or Oracle:

      BEGIN { if( ! $ENV{PERLIO} ) { $ENV{PERLIO}= ":utf8"; exec $^X, $0, @ARGV; } }

      - tye