📄 open.html
字号:
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../displayToc.js"></script>
<script language="JavaScript" src="../tocParas.js"></script>
<script language="JavaScript" src="../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../scineplex.css">
<title>open - perl pragma to set default PerlIO layers for input and output</title>
<link rel="stylesheet" href="../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',1);</script>
<h1><a>open - perl pragma to set default PerlIO layers for input and output</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<li><a href="#nonperlio_functionality">NONPERLIO FUNCTIONALITY</a></li>
<li><a href="#implementation_details">IMPLEMENTATION DETAILS</a></li>
<li><a href="#see_also">SEE ALSO</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>open - perl pragma to set default PerlIO layers for input and output</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IN</span> <span class="operator">=></span> <span class="string">":crlf"</span><span class="operator">,</span> <span class="string">OUT</span> <span class="operator">=></span> <span class="string">":bytes"</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">OUT</span> <span class="operator">=></span> <span class="string">':utf8'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IO</span> <span class="operator">=></span> <span class="string">":encoding(iso-8859-7)"</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IO</span> <span class="operator">=></span> <span class="string">':locale'</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':utf8'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':locale'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':encoding(iso-8859-7)'</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':std'</span><span class="operator">;</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>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).</p>
<p>The <a href="../lib/Pod/perlfunc.html#item_open"><code>open</code></a> pragma serves as one of the interfaces to declare default
"layers" (also known as "disciplines") for all I/O. Any two-argument
open(), <a href="../lib/Pod/perlfunc.html#item_readpipe"><code>readpipe()</code></a> (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.</p>
<p>With the <code>IN</code> subpragma you can declare the default layers
of input streams, and with the <code>OUT</code> subpragma you can declare
the default layers of output streams. With the <code>IO</code> subpragma
you can control both input and output streams simultaneously.</p>
<p>If you have a legacy encoding, you can use the <code>:encoding(...)</code> tag.</p>
<p>If you want to set your encoding layers based on your
locale environment variables, you can use the <code>:locale</code> tag.
For example:</p>
<pre>
<span class="variable">$ENV</span><span class="operator">{</span><span class="string">LANG</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'ru_RU.KOI8-R'</span><span class="operator">;</span>
<span class="comment"># the :locale will probe the locale environment variables like LANG</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">OUT</span> <span class="operator">=></span> <span class="string">':locale'</span><span class="operator">;</span>
<span class="keyword">open</span><span class="operator">(</span><span class="variable">O</span><span class="operator">,</span> <span class="string">">koi8"</span><span class="operator">);</span>
<span class="keyword">print</span> <span class="variable">O</span> <span class="keyword">chr</span><span class="operator">(</span><span class="number">0x430</span><span class="operator">);</span> <span class="comment"># Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1</span>
<span class="keyword">close</span> <span class="variable">O</span><span class="operator">;</span>
<span class="keyword">open</span><span class="operator">(</span><span class="variable">I</span><span class="operator">,</span> <span class="string">"<koi8"</span><span class="operator">);</span>
<span class="keyword">printf</span> <span class="string">"%#x\n"</span><span class="operator">,</span> <span class="keyword">ord</span><span class="operator">(<</span><span class="variable">I</span><span class="operator">>),</span> <span class="string">"\n"</span><span class="operator">;</span> <span class="comment"># this should print 0xc1</span>
<span class="keyword">close</span> <span class="variable">I</span><span class="operator">;</span>
</pre>
<p>These are equivalent</p>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':utf8'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IO</span> <span class="operator">=></span> <span class="string">':utf8'</span><span class="operator">;</span>
</pre>
<p>as are these</p>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':locale'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IO</span> <span class="operator">=></span> <span class="string">':locale'</span><span class="operator">;</span>
</pre>
<p>and these</p>
<pre>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">':encoding(iso-8859-7)'</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="keyword">open</span> <span class="string">IO</span> <span class="operator">=></span> <span class="string">':encoding(iso-8859-7)'</span><span class="operator">;</span>
</pre>
<p>The matching of encoding names is loose: case does not matter, and
many encodings have several aliases. See <a href="../lib/Encode/Supported.html">the Encode::Supported manpage</a> for
details and the list of supported locales.</p>
<p>Note that <a href="../lib/Pod/perlrun.html#item__3autf8"><code>:utf8</code></a> PerlIO layer must always be specified exactly like
that, it is not subject to the loose matching of encoding names.</p>
<p>When <a href="../lib/Pod/perlfunc.html#item_open"><code>open()</code></a> is given an explicit list of layers (with the three-arg
syntax), they override the list declared using this pragma.</p>
<p>The <code>:std</code> subpragma on its own has no effect, but if combined with
the <a href="../lib/Pod/perlrun.html#item__3autf8"><code>:utf8</code></a> or <code>:encoding</code> 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 <a href="../lib/Pod/perlrun.html#item__3autf8"><code>:utf8</code></a>, a <code>:std</code> will mean that STDIN, STDOUT, and
STDERR are also in <a href="../lib/Pod/perlrun.html#item__3autf8"><code>:utf8</code></a>. On the other hand, if only output is
chosen to be in <code>:encoding(koi8r)</code>, a <code>:std</code> will cause only the
STDOUT and STDERR to be in <code>koi8r</code>. The <code>:locale</code> subpragma
implicitly turns on <code>:std</code>.</p>
<p>The logic of <code>:locale</code> is described in full in <a href="../lib/encoding.html">the encoding manpage</a>,
but in short it is first trying <code>nl_langinfo(CODESET)</code> and then
guessing from the LC_ALL and LANG locale environment variables.</p>
<p>Directory handles may also support PerlIO layers in the future.</p>
<p>
</p>
<hr />
<h1><a name="nonperlio_functionality">NONPERLIO FUNCTIONALITY</a></h1>
<p>If Perl is not built to use PerlIO as its IO system then only the two
pseudo-layers <a href="../lib/Pod/perlrun.html#item__3abytes"><code>:bytes</code></a> and <a href="../lib/Pod/perlrun.html#item__3acrlf"><code>:crlf</code></a> are available.</p>
<p>The <a href="../lib/Pod/perlrun.html#item__3abytes"><code>:bytes</code></a> layer corresponds to "binary mode" and the <a href="../lib/Pod/perlrun.html#item__3acrlf"><code>:crlf</code></a>
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 <a href="../lib/Pod/perlfunc.html#item_binmode"><code>binmode()</code></a> is a no-op, but perform their functions
everywhere if PerlIO is enabled.</p>
<p>
</p>
<hr />
<h1><a name="implementation_details">IMPLEMENTATION DETAILS</a></h1>
<p>There is a class method in <code>PerlIO::Layer</code> <code>find</code> which is
implemented as XS code. It is called by <a href="../lib/Pod/perlfunc.html#item_import"><code>import</code></a> to validate the
layers:</p>
<pre>
PerlIO::Layer::->find("perlio")</pre>
<p>The return value (if defined) is a Perl object, of class
<code>PerlIO::Layer</code> which is created by the C code in <em>perlio.c</em>. As
yet there is nothing useful you can do with the object at the perl
level.</p>
<p>
</p>
<hr />
<h1><a name="see_also">SEE ALSO</a></h1>
<p><a href="../lib/Pod/perlfunc.html#binmode">binmode in the perlfunc manpage</a>, <a href="../lib/Pod/perlfunc.html#open">open in the perlfunc manpage</a>, <a href="../lib/Pod/perlunicode.html">the perlunicode manpage</a>, <a href="../lib/PerlIO.html">the PerlIO manpage</a>,
<a href="../lib/encoding.html">the encoding manpage</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -