blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl 「 比較演算子 」(0x0b)

Perl 「 比較演算子 」(0x0b)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x0b 回。

Perl の比較演算子について。




比較演算子



Perl には比較演算子 (Comparison operator) があります。

比較演算子は 2 つの値を比較するための演算子で、プログラム中の条件分岐で使います。

大抵のプログラミング言語にも同様の演算子はありますが、機能や約束事が微妙に違う場合がある様です。


比較演算子 : 数値



Perl では、数値を比較するための数値比較演算子 (Numeric comparison operator) が用意されています。

数値比較演算子は以下の様なものです。


< # より小さい
<= # より小さいか等しい
== # 等しい
>= # より大きいか等しい
> # より大きい
!= # 等しくない


普通、等しい意味の等号にはイコール (=) を使いますが、Perl を含めたほとんどのプログラミング言語で、イコールは、代入演算子として使われています。

このため、等しい意味を表すには、イコールを 2 つ並べたもの (==) 使います。

「より大きいか等しい」は「大なり」と「イコール」を続けた >= を使います。

記号の順番を入れ替えて => でもいい様に思いますが、 Perl の場合 => は別の意味 (ハッシュで利用) を持つ演算子に指定されているので、数値比較には使えません。


$num = 3;

if ( $num < 3 ) {
print "\$num は 3 より小さいです。\n";
}


if 文で条件分岐する上記の例では、print は実行されずに終了します。条件に $num が「3 より小さい場合」とあるからです。


比較演算子 : 文字列



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)
<= le # より小さいか等しい (less than or equal to)
>= 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










同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲