• 締切済み

perlでのオブジェクト指向の書き方

以下のPHPソースをPerlで書き直したいのですが、Perlのコンストラクタがイマイチわからないので どなたかご教授ください。 可能であれば以下のソースのperlバージョンを記載して頂けると幸いで御座います。 ○呼び出し側 ・index.inc require_once('common.inc'); require_once('db.inc'); class index {     var $objCommon= '';     var $objDB= '';     function index() {         $this->objCommon = new common;         $this->objDB = new db("mysql");     }     function main() {         //DB接続         $db_connect = $this->objDB->connect();         //DBから値を取得         $data = $this->objDB->sample($db_connect);     } } ○呼び出される側 ・db.inc class db{     var $db_dsn_type;     function db_wrap($db_type){         $this->db_dsn_type = $db_type;         $this->objCommon = new common;     }     各function } ・common.inc class common{     各function } ※コンストラクタなし

みんなの回答

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

すみません、コンストラクタは一行でも書けました。 sub new {  return ( my $self = bless {} ); }

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

コメント付きで、最小単位のオブジェクトでいきましょうか。 ・PerlObj.pm ### Perlにおいて、クラスはただのパッケージであり、 package PerlObj; sub hajimeruzamasuyo { # ※コンストラクタは、普通はnewにしましょう  my $class = shift;  my $self = {}; ### オブジェクトはただのblessされたリファレンスであり、  return bless($self, $class); } ### そしてメソッドは第一引数にオブジェクトをとるただのサブルーチンである。 sub ikudegannsu {  my $self = shift; # 第一引数(自分自身)  print "funnga-!"; } 1; # 真であるという、お約束で必須。 ・sample.pl use PerlObj; my $obj = PerlObj->hajimeruzamasuyo; $obj->ikudegannsu; # 実行結果:funnga-! 要するに、コンストラクタの中身は何もなくとも、最低3行のコピペで動きます。 あとは「 -> 」を付けて、サブルーチン呼び出すだけですね。 上の二つのファイルを同じディレクトリに置けば動きます(全角スペースは消してください)。 perl -le 'print for @INC'で表示されるパスに放り込めば どこからでも使えるようになります(rootいりますが)。 初期値とかパラメータとかアクセサとか、或いは引数を受けるとか、 そういう必要が出たらFizzBuzzを参考にして下さい。

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

「書き方」だけでいいですか? こんなカンジです。 package Fizz::Buzz; use strict; use warnings; use Class::Accessor "antlers"; # アクセサ has Fz  => (isa => 'Int', is => 'ro'); has Bz  => (isa => 'Int', is => 'ro'); has FBz  => (isa => 'Int', is => 'ro'); has start => (isa => 'Int', is => 'rw'); has end  => (isa => 'Int', is => 'rw'); sub new {   my $proto = shift;   my $class = ref $proto || $proto;   my ($i, $j) = @_;   my %param = init($i, $j);   my $self = { %param };   return bless($self, $class); } sub init {   my ($i, $j) = @_;   my %param = (     Fz  => 3,     Bz  => 5,     FBz  => 15,     start => $i || 1,     end  => $j || 100,   ); } sub z {   my $self = shift;   my $i = shift || $self->{start};   my $j = shift || $self->{end};   while ( $i <= $j ) {     if  ( $i % $self->{FBz} == 0 ) { print "FizzBuzz\n"; }     elsif ( $i % $self->{Fz} == 0 ) { print "Fizz\n"; }     elsif ( $i % $self->{Bz} == 0 ) { print "Buzz\n"; }     else               { print $i, "\n"; }     $i++;   } } 1; # 必須。 ・fizzbuzz.pl #!/usr/bin/env perl use Fizz::Buzz; my $fb = Fizz::Buzz->new(); $fb->z; ## 初期値1~100から変える場合 # my $fb = Fizz::Buzz->new(100, 200); # newするときに変える # $fb->start(100);          # startを変える # $fb->end(200);           # endを変える # $fb->z(100, 200);          # 実行時に変える

rapmaster7
質問者

お礼

回答ありがとうございます。私の技術力が足りないのですぐに解析出来ませんが、頑張って解析してみます。