2008-05-09
Perl の == と eq の実装の違い
「Perl学習はじめました」でハマった以下の文字列比較に eq ではなく == を使ったコードがなぜ期待したとおりに動かなかったのか、調べてみました。
まず == は数値を期待していて、ここに文字列をわたすと Perl の文字列から数値への変換ルールで入力文字列が(だいたい) 0 になり、同様に 'quit' も数値変換されて 0 になるため 0 == 0 として必ず while を抜けるのは理解できました。
で、いい機会なので実装がどうなってるのかを見ようと思って Perl 5.8.8 のソースコードを見てみました。でも、O_SEQ というのが eq の opname だということ、 O_EQ というのが == の opname だということまではわかったのですが、そのバイトコードを処理する実装を見つけられませんでした。
そこで Perl 1.0 のソースコードなら単純だろうと当たりをつけて、このサイトから Perl 1.0 のソースコードをダウンロードして、いろいろ調べてみます。
でいろいろ追っかけると以下のような流れでバイトコードを実行してるみたいです。
- main (perly.c)
- cmd_execute (cmd.c)
- eval (eval.c)
というわけで見つけた実装
まず文字列比較の eq
arg.c:1782 handy.h:20
というわけで単純に strcmp してました。
次、数値比較の ==
arg.c:1508
perl.h:56
str.c:83
ふむ。文字列を atof で double に変換しちゃうということで。なるほどねー
Perl 5.8 での実装が見つけられなかったのがちょっと悔しいけど、これからまた「はじめてのPerl」の続きをします。
ちなみに STR 型は str.h で定義されてました。でも最近のは utf-8 フラグとかいろいろ拡張されてるらしいので、あまり意味ないかもしれないなあ。
1 Trackback
[Perl] 「eq」 と 「==」 、 「ne」 と 「!=」
いままで、あんまり意識しないで使ってきていましたが、 eq と == は全然違うのですね。 同じく、ne と != も全然違うのですね。 作成中の...
Track from Your Website
http://coji.s9.xrea.com/trackback/tb.php?id=67


Comment
No Comments