Home
March 21, 2010 5:42:56 AM EST
home
back print
open   (3pm) manpage
open
3pm
2007-12-18
perl v5.10.0
Perl Programmers Reference Guide
  • NAME
      open - perl pragma to set default PerlIO layers for input and output
  • SYNOPSIS

          use open IN  => ":crlf", OUT => ":bytes";
          use open OUT => (Aq:utf8(Aq;
          use open IO  => ":encoding(iso-8859-7)";

          use open IO  => (Aq:locale(Aq;

          use open (Aq:encoding(utf8)(Aq;
          use open (Aq:locale(Aq;
          use open (Aq:encoding(iso-8859-7)(Aq;

          use open (Aq:std(Aq;

  • DESCRIPTION
      Full-fledged support for I/O layers is now implemented provided Perl is configured to use PerlIO as its IO system (which is now the default).

      The <(>CW"open" pragma serves as one of the interfaces to declare default "layers" (also known as "disciplines") for all I/O. Any two-argument open(), readpipe() (aka qx//) and similar operators found within the lexical scope of this pragma will use the declared defaults. Even three-argument opens may be affected by this pragma when they don't specify IO layers in MODE.

      With the <(>CW"IN" subpragma you can declare the default layers of input streams, and with the <(>CW"OUT" subpragma you can declare the default layers of output streams.  With the <(>CW"IO"  subpragma you can control both input and output streams simultaneously.

      If you have a legacy encoding, you can use the <(>CW":encoding(...)" tag.

      If you want to set your encoding layers based on your locale environment variables, you can use the <(>CW":locale" tag. For example:


          $ENV{LANG} = (Aqru_RU.KOI8-R(Aq;
          # the :locale will probe the locale environment variables like LANG
          use open OUT => (Aq:locale(Aq;
          open(O, ">koi8");
          print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
          close O;
          open(I, "<koi8");
          printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
          close I;



      These are equivalent


          use open (Aq:encoding(utf8)(Aq;
          use open IO => (Aq:encoding(utf8)(Aq;



      as are these


          use open (Aq:locale(Aq;
          use open IO => (Aq:locale(Aq;



      and these


          use open (Aq:encoding(iso-8859-7)(Aq;
          use open IO => (Aq:encoding(iso-8859-7)(Aq;



      The matching of encoding names is loose: case does not matter, and many encodings have several aliases.  See Encode::Supported for details and the list of supported locales.

      When open() is given an explicit list of layers (with the three-arg syntax), they override the list declared using this pragma.

      The <(>CW":std" subpragma on its own has no effect, but if combined with the <(>CW":utf8" or <(>CW":encoding" subpragmas, it converts the standard filehandles (STDIN, STDOUT, STDERR) to comply with encoding selected for input/output handles.  For example, if both input and out are chosen to be <(>CW":encoding(utf8)", a <(>CW":std" will mean that STDIN, STDOUT, and STDERR are also in <(>CW":encoding(utf8)".  On the other hand, if only output is chosen to be in <(>CW":encoding(koi8r)", a <(>CW":std" will cause only the STDOUT and STDERR to be in <(>CW"koi8r".  The <(>CW":locale" subpragma implicitly turns on <(>CW":std".

      The logic of <(>CW":locale" is described in full in encoding, but in short it is first trying nl_langinfo(CODESET) and then guessing from the LC_ALL and LANG locale environment variables.

      Directory handles may also support PerlIO layers in the future.
  • NONPERLIO FUNCTIONALITY
      If Perl is not built to use PerlIO as its IO system then only the two pseudo-layers <(>CW":bytes" and <(>CW":crlf" are available.

      The <(>CW":bytes" layer corresponds to "binary mode" and the <(>CW":crlf" layer corresponds to "text mode" on platforms that distinguish between the two modes when opening files (which is many DOS-like platforms, including Windows).  These two layers are no-ops on platforms where binmode() is a no-op, but perform their functions everywhere if PerlIO is enabled.
  • IMPLEMENTATION DETAILS
      There is a class method in <(>CW"PerlIO::Layer" <(>CW"find" which is implemented as XS code.  It is called by <(>CW"import" to validate the layers:


         PerlIO::Layer::->find("perlio")



      The return value (if defined) is a Perl object, of class <(>CW"PerlIO::Layer" which is created by the C code in perlio.c.  As yet there is nothing useful you can do with the object at the perl level.
  • SEE ALSO
      "binmode" in perlfunc, "open" in perlfunc, perlunicode, PerlIO, encoding


Current Users: 94 © 1999-2009 PenguinSoft. All trademarks and copyrights on this page are owned by their respective companies. Linux is a trademark of Linus Torvalds.