<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 5.8以降では<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">open</anchor></code>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイルハンドル</anchor>にすることができます。
(それ以前では<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IO::String</anchor></code>で同じことが実現できます。)</p><pre class="perl example code">my $string = q&lt;... some string ...&gt;;
open my $fh, '&lt;:utf8', \$string;</pre><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PerlIO</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">層</anchor>として<code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code>を指定しておくことで、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">旗</anchor>付きの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を扱うことができます。
(例えば<code class="perl example" xml:lang="en">$fh-&gt;<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">getc</anchor></code>で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非ASCII文字</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>として順に得られます。)</p><p>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor>)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 5.8.7 for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Linux</anchor>と5.8.4 for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows XP</anchor>で試したところでは、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">改行</anchor>を勝手に変更してくれることはないようです。
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor>)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end>
<code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code>としておけば<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">旗</anchor>付き<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>として扱われますが、
<code class="char" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+0100</anchor></code>以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が1<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>も含まれていない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 8859</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>になっている時に<code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code>がついていると、不正な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>があると言われてしまいます。</p><p>かといって<code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code>を付けないと常に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>扱いになってしまいますし。。。</p><p>仕方が無いので<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor>:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is_utf8</anchor></code>で場合分けすることにします。。。
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor>)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end>
<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">open</anchor></code>の第1引数に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変数</anchor>を指定した場合、
その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変数</anchor>は<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IO::Handle</anchor></code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オブジェクト</anchor>になりますから、
<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IO::Handle</anchor></code>で定義されている<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>が使えます。<pre class="perl example code">my $ch = $fh-&gt;getc;</pre></p><p>のように<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オブジェクト指向</anchor>な書き方ができます。ただし、明示的に<pre class="perl example code"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">require</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IO::Handle</anchor>;</pre></p><p>とでもしておかないといけません。</p><p>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor>)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end>
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;3</anchor-internal> <code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code> ではなく <code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding</anchor>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor>)</code> を使うとよさげです。
多少パフォーマンスは落ちるかもですが。。。</p></body></html>