電子書籍の厳選無料作品が豊富!

以下の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
}
※コンストラクタなし

A 回答 (3件)

すみません、コンストラクタは一行でも書けました。



sub new {
 return ( my $self = bless {} );
}
    • good
    • 0

コメント付きで、最小単位のオブジェクトでいきましょうか。



・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を参考にして下さい。
    • good
    • 0

「書き方」だけでいいですか?


こんなカンジです。

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);          # 実行時に変える
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/18 11:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!