Perl で文字列を比較する場合は、専用の文字列比較演算子 (String comparison operator) が用意されています。
lt # より小さい (less than)
le # より小さいか等しい (less than or equal to)
eq # 等しい (equal)
ge # より大きいか等しい (greater than or equal to)
gt # より大きい (greater than)
nq # 等しくない (not equal)
例えば、以下の様に比較が出来ます。
$str = "abc";
if ( 'abc' eq $str ) {
print "\$str の文字列は $str です。\n";
}
この例では、$str に「abc」の文字列が入っているので、if 文の中の print は実行されます。
次の例ではどうでしょう。
my $str0 = "\x{61}\x{62}\x{63}";
my $str1 = 'abc';
if ( $str0 eq $str1 ) {
print "\$str0 と\$str1 は同じ文字列です。\n";
$str0 と $str1 の値は見るからに違いますが、if 文での条件判定ではイコールと判断されて、print が実行されます。
なぜなら「\x{61}」という記述はコードポイントと呼ばれる値だからです。
これはコンピュータ内部で文字を表すコードの値を意味するので、文字列として比較出来ます。
「\x{61}」は a を、「\x{62}」は b を、「\x{63}」は c を指し示すので、コンピュータが内部で 「abc」と等価と判断する様です。おもしろいですね。
ちなみにこの値は、ASCII (アスキー) コードの 16 進数の値です。「ASCII コード表」等で検索すれば参考になる Web サイトを見つけられます。
比較演算子 : まとめ
数値と文字列の比較演算子をまとめると以下の様になります。
数値 文字列 比較
----------------------------------------------------------
== eq # 等しい (equal)
!= ne # 等しくない (not equal)
< lt # より小さい (less than)
> gt #より大きい (greater than)
= ge # より大きいか等しい (greater than or equal to)
0x0b-> 0x0c へ
数値のコードポイントと文字列の比較は、コンピュータの文字表現が、内部的にすべて数値 (バイトコード) で処理されていることで可能になっています。
しかしながら、バイトコードと、その対象となる文字の割り当てには、様々なパターンがあって一様ではありません。
これはいわゆる文字コード (JIS とか UTF とか EUC とか) の話になると思いますが、僕は文字コードの扱いがさっぱりです。
文字集合と符号化方式の区別もいまいちついていない状態なので、利用しているシステムのコードに合わせてテキストを書く、文字コードが合わないファイルがあれば変換する、程度のことしか出来ません。
なので、複雑なことは何もしていないにも関わらず、ちょっとした問題が起きると、解決するまでにとても時間がかかります。
Wikipedia には以下の様に書いてあります。
文字コード
多様な文字コードの存在は文字コードの互換性問題をひきおこす。文字コードの互換性問題とは、ある文字コードで記録されたデータを別の文字コードに変換しようとするとき、一方で定義されている文字がもう一方では定義されていない(あるいは用途によって2種類の文字に分けられている)という問題である。日本語では、これは特殊な漢字(苗字や団体名に使われる漢字)などが入ったデータベースを扱うときなどに問題となる。また文字コードの変換にかかるコストはばかにならないことが多い。
日本語 英語の脳内互換も、僕にとっては多大なコストではありますが、なにしろ、代表的な文字コードだけで 100 種類もあるというのだから、それはまあ、大変だなと思う他ありません。。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x0c) へ続く。
過去記事 RSS