- 締切済み
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 } ※コンストラクタなし
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kuroizell
- ベストアンサー率55% (95/170)
すみません、コンストラクタは一行でも書けました。 sub new { return ( my $self = bless {} ); }
- kuroizell
- ベストアンサー率55% (95/170)
コメント付きで、最小単位のオブジェクトでいきましょうか。 ・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)
「書き方」だけでいいですか? こんなカンジです。 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); # 実行時に変える
お礼
回答ありがとうございます。私の技術力が足りないのですぐに解析出来ませんが、頑張って解析してみます。