PerlのOOPを学習する

仕事でメインで使うことはないのにも関わらず(自分用のツールは勝手にPerlで書いてるけど)、プライベートでPerl勉強中です。なぜってPerl書くのが楽しくて仕方なくなってきたからです!

「続・初めてのPerl」を12章まで読み進めました。以下はPerlオブジェクト指向の勉強のために書いた練習スクリプトです。Perlでのクラスの継承とかインスタンスの扱いとかが本書でのレベルくらいは理解できてきたように思います。まだまだ奥が深いと思うと楽しみです。

今のスキルレベルでできるだけ短く書く事にトライしましたが、逆に直感的で読みやすくなった気がして、そこがPerlに焦がれている理由かなぁと思ったり。

#!/usr/bin/perl
# studying how to use the perl instances

use strict;
use warnings;

# class Animal
{ package Animal;
  sub new { bless { Name => $_[1], Color => $_[0]->default_color }, $_[0]; }
  sub name { ref $_[0] ? $$_[0] : "an unamed $_[0]"; }
  sub default_color { "White" }
  sub get_color { $_[0]->{Color}; }
  sub set_color { $_[0]->{Color} = $_[1]; $_[0]; }
  sub speak { $_[0]->{Name}, " goes ", $_[0]->sound, "!"; }
  sub speak_print { print $_[0]->{Name}, " goes ", $_[0]->sound, "!"; }
}

# class Horse extends class Animal
{ package Horse;
  our @ISA = qw/ Animal /;
  sub default_color { "Brown" }
  sub sound { "heheeeeen" }
}

print "\n";
print "--- Using Class Method ---\n";
print "Animal->name          : ", Animal->name, "\n";
print "Animal->default_color : ", Animal->default_color, "\n";
print "\n";

my $di = 
  Horse->new("Deep Impact")
       ->set_color("Black");

print "--- Using Instance Method ---\n";
print "Instance              : ", $di, "\n";
print "Name                  : ", $di->{Name}, "\n";
print "Default Color         : ", $di->default_color, "\n";
print "Color                 : ", $di->{Color}, "\n";
print "Color(getter)         : ", $di->get_color, "\n";
print "speak() return        : ", $di->speak ,"\n";
print "speak_print()         : ";
my $return = $di->speak_print;
print "\n";
print "speak_print() return  : ", $return, "\n";
$di->set_color("Black-And-White");
print "set_color() again     : ", $di->{Color}, "\n";
print "\n";

実行結果は以下です。

[user 20071002]$ ./perl_study.pl 

--- Using Class Method ---
Animal->name          : an unamed Animal
Animal->default_color : White

--- Using Instance Method ---
Instance              : Horse=HASH(0x86ef7c8)
Name                  : Deep Impact
Default Color         : Brown
Color                 : Black
Color(getter)         : Black
speak() return        : Deep Impact goes heheeeeen!
speak_print()         : Deep Impact goes heheeeeen!
speak_print() return  : 1
set_color() again     : Black-And-White

[user 20071002]$ 

たまにJavaを書いていますが(Javaも未熟ですが)、PerlOOPの方が自由で楽しいと感じます。もっと良いコードをたくさん読んで、自分も優れたコードを書けるようになりたいと思います。