文字列処理いろいろ

内部エンコーディング

http://app.blog.livedoor.jp/dankogai/tb.cgi/50276015

Perl 5.8では内部で扱う文字コードUTF-8です。それ以外のUTFはすべてEncodeモジュールで扱うことが出来ます。

perlスクリプトはUTF-8で書くのが無難ということだね。

なお、内部的に扱われている Unicode 文字列にはUTF8フラグがつくとのこと。
http://www.rwds.net/kuroita/program/Perl_unicode.htmlによれば

フラグが無効であれば、スカラ内のバイト列は、シングルバイトエンコーディングとして、解釈されます。フラグが有効であれば、スカラ内のバイト列は、 (マルチバイトの、可変調の) UTF-8エンコードされたキャラクタのコードポイントとして、解釈されます。

ONだと文字列はUTF-8エンコードされたものと解釈される。
OFFだと文字列はシングルバイトエンコードされたものと解釈される。
ということか(いまいち理解不足)

UTF8フラグのON/OFF

何もしていなければ、UTF8フラグはOFF
use utf8;すると、ONになる。*1
では、実験。

use_utf.pl

use utf8;

my $str = "あ";

#must be ON
print utf8::is_utf8($str) ? "Flag is ON\n" : "Flag is OFF\n";
#must be single _
$str =~ s/[あ]/_/g;
print $str."\n";

[結果]
Flag is ON
_



次。
no_use_utf8.pl

#use utf8;

my $str = "あ";

#must be OFF
print utf8::is_utf8($str) ? "Flag is ON\n" : "Flag is OFF\n";
#must be ___
$str =~ s/[あ]/_/g;
print $str."\n";

[結果]
Flag is OFF
___

packとunpack

perldoc -f pack

pack TEMPLATE,LIST
Takes a LIST of values and converts it into a string
using the rules given by the TEMPLATE.

packはTEMPLATEで指定されたルールに基づきLISTをバイナリに変換し、結合する関数。



perldoc -f unpack

unpack TEMPLATE,EXPR
"unpack" does the reverse of "pack":
it takes a string and expands it out into a list of values.
(In scalar context, it returns merely the first value produced.)

unpackはバイナリをTEMPLATEで指定されたルールに基づきLISTに展開する関数。

URLエンコード/デコード

#エンコード
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
#デコード
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;

http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
より

*1:UTF-8でソースを書いていることを前提にしている