Perl のオブジェクトについて最近理解した分のメモ

以前勉強してから情勢(って)が変わってきたものや抜けていた部分のメモ。

  • Perl のオブジェクトは bless したリファレンス
    • 以前はハッシュリファレンスを bless するのが主流だった(と、自分は認識している)が、最近はスカラリファレンスを利用した Inside-Out Object もオシャレなのかも。
    • Class::Std を使うと便利
  • bless で結びつけられた package 名を取得するには以下の方法がある
    • ref
    • Scalar::Util の blessed
  • オブジェクトには実は便利メソッドがある
    • UNIVERSAL 嫁
    • isa() と can() がありゃ十分ちゃ十分か。なるほど。

ref は JavaScript の typeof のように使え、bless してないリファレンスに対して使うと以下の組み込みの型を返す。

  • SCALAR
  • ARRAY
  • HASH
  • CODE
  • REF
  • GLOB
  • LVALUE

package 以外のものが返って来てしまうという意味ではちょっと危険ではあるけど、それはそれとして ref は知っとくと便利だなと思った。Perl は奥が深いよ、ほんと。

PHP の is_a() と method_exists()、Ruby の Object#is_a? と Module#method_defined? に相当するのは、Scalar::Util を使って

defined( blessed( $ref ) ) && $ref->isa( package_name )
defined( blessed( $ref ) ) && $ref->can( method_name )

になるのかな?

今後 Class::Std を使うかどうかは分からない1けど、自分の目的はレンタルスペースで CGI を動かすことではないし今後もそういうことはないと思うので、便利に使えるシーンがくるかもしれない。押さえておこう。

[2007-09-06 追記]メソッド一覧はやっぱ欲しいなぁと思ったけど UNIVERSAL にはそんな機能はない。Class::Inspector を使うのが楽らしい。Fink にも deb にもパッケージがあるので、まぁそれほど使うのに抵抗はないかな?

  1. というか新規に Perl スクリプトは書きたくないし、Class::InsideOut なんてのもあるらしい。 

More