⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 open.html

📁 perl教程
💻 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">=&gt;</span> <span class="string">":crlf"</span><span class="operator">,</span> <span class="string">OUT</span> <span class="operator">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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
&quot;layers&quot; (also known as &quot;disciplines&quot;) 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">=&gt;</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">"&gt;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">"&lt;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">(&lt;</span><span class="variable">I</span><span class="operator">&gt;),</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">=&gt;</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">=&gt;</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">=&gt;</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 &quot;binary mode&quot; and the <a href="../lib/Pod/perlrun.html#item__3acrlf"><code>:crlf</code></a>
layer corresponds to &quot;text mode&quot; 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::-&gt;find(&quot;perlio&quot;)</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 + -