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 と != も全然違うのですね。 作成中の...

From : 外部記憶 @ 2009-08-31 15:58:58

Track from Your Website

http://coji.s9.xrea.com/trackback/tb.php?id=67

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。