• ベストアンサー

オブジェクト指向処理

以下のようにnew{}の中で作成したstrをsub{}の中で利用したいのですが、どうすればよいでしょうか? perlでOOPするにあたり、参考になるような良書がありましたら教えてください。 new { $this = shift; my ($s1, $s2, $s3) = @_; my str = $s1.$s2.$s3; } sub { $this = shift; print str #new{}の中で定義したstr }

  • Perl
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.3

#1 です。 まず、パッケージです。Test1.pm と言う名前で保存してください。 #!/usr/local/bin/perl package Test1; sub new { my $self = shift; my $data = { s1 => shift, s2 => shift, s3 => shift }; bless $data, $self; } sub disp { my $self = shift; print $self->{s1}. $self->{s2}. $self->{s3}; } 1; 次に、テストプログラムです。適当な名前で保存してください。 #!/usr/local/bin/perl package main; use Test1; my $obj = Test1->new('abc', 123, 'def'); $obj->disp; exit(0); bless で結びつけたオブジェクトに対して、パッケージ内で設定, 参照などの処理を行います。その考え方が理解できないと、Perlでのoopは分かり辛いです。#1で示したページは、その考え方を分かりやすく示している、非常に良いページです。 それから、#1ではらくだ本と書いたのですが、「プログラミングPerl Vol1, 2」の他に、「実用Perlプログラミング」もoopの説明としては分かりやすいです。 らくだ本レベルの説明ですが、図が結構分かりやすいです。

その他の回答 (2)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

>どのようにすればsub{}からnew{}のstrをprintできるか sub new {bless {'str'=>join '',@_[1..$#_]},shift} sub sub {print $_[0]->{'str'}} とかとかとか。 (There's More Than One Way To Do It) >OOPするにあたり それ以前にperlの文法を覚えるほうが先だと思う。 (質問に書いてあるコードはperlのコードとして成り立ってないし)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

PerlのOOPは非常に独特な書き方をします。他の言語の記述方法は、あまり役に立ちません(特に、初学者の場合)。 次のページが非常に分かりやすいです。参考にして見てください。 http://www.pure.ne.jp/~learner/program/Perl_oo.html http://perl.infoware.ne.jp/documents/perlboot.ja.html 書籍ですが、僕はらくだ本を参考にしました。でも、ほとんどはWebから情報を得ました。

参考URL:
http://www.pure.ne.jp/~learner/program/Perl_oo.html,http://perl.infoware.ne.jp/documents/perlboot.ja.html
tomoremo
質問者

補足

回答ありがとうございます。 記述してありましたホームページを参考にsub{}からnew{}のstrをprintしましたがうまくいきませんでした。 申し訳ないのですが、添付したコードだと、どのようにすればsub{}からnew{}のstrをprintできるか具体的におしえいていただけるとうれしいです。

関連するQ&A

  • オブジェクト指向プログラミング

    Perlのクラス定義の例題なんですが、わからないところがあります。 ファイルCapFile.pm package CapFile; sub new{ my $class = shift; my $path = shift; return(bless { ':path' => $path }, $class); } sub read { my $obj = shift; my $path = $obj->{':path'}; ..... ファイルcap-test #!/usr/bin/perl use CapFile; $cap = new CapFile ('/etc/termcap'); $cap->read(); ... サブルーチンreadにある my $path = $obj->{':path'}; なんですが、呼び出し側では引数がないのですが、$objには何が入っているんでしょうか。 そして$pathには何が入るんでしょうか。

    • ベストアンサー
    • Perl
  • perlのクラスについて

    perlでクラスを作成しています。その際、コンストラクタnewで無名配列を定義して、funcメソッドで、この無名配列に値をいれるにはどうすればよいでしょうか? sub new { my $class = shift; my $self->array = []; bless($self, $class); return $self; } sub func { my $self = shift; $self->arrayに配列のデータを入れる。 }

    • ベストアンサー
    • Perl
  • Perl 強制終了の回避について

    Attempt to free unreferenced scalar とは? http://oshiete1.goo.ne.jp/qa4237453.html の続きです。 とりあえず、下に現状で分かる最小限の再現性があるスクリプトを 書いておきます。 print &opentmpl("body"); print &opentmpl('footer'); # これがない場合はエラーにならない sub opentmpl { my $fn = shift; my $VAR = shift || {}; my $file = &{$fn}(); &regex(\$file, $VAR, '__([A-Z_\d]+?(\[\d+?\])?)__', ['$VAR->{"%s"}', '$1']); &regex(\$file, $VAR, '&{(.+?)}&', ['%s', '$1']); return $file; return undef; } sub regex { my $str = shift; my $VAR = shift; my $pattern = shift; my $replace = shift; $$str =~ s/((([^\n]*?)$pattern(?=.*))+(\n?))/&func($1, $VAR, $pattern, @$replace)/egs; return; } sub func { my $str = shift; my $VAR = shift; my $pattern = shift; my $buf = shift; $str =~ s/$pattern/$@ = ''; $_ = eval(sprintf($buf, map { eval($_); } @_)); $@ ? $@ : $_/egs; if($str =~ /^\s*\n?$/s) { return; } return $str; } sub body { print "Content-type: text/plain; charset=shift_jis\n\n"; return <<'HTML'; &{ return &opentmpl('table', {'TEST' => 'test'}); }& HTML } sub table { return <<'HTML'; __TEST__ HTML } sub footer { return <<'HTML'; test HTML } 調べてみた限りではActivePerl for Win32以外のPerlでも同様のよう です。 (Linux上でも同様のようです) 5.8.8ではエラーになりますが、5.10.xではエラーにならないようです。 (同じ環境において5.8.8では再現し、5.10.0にバージョンアップすると 再現しなくなり、再度5.8.8にバージョンダウンすると再現します) 本番機の環境が5.8.8で勝手にバージョンアップなどができないため、 5.8.8で正常に動作するようにするにはどうしたらよいでしょうか。 結構、無駄も多いと思いますので全く同じ動作をしながらより効率の いい書き方ができたらいいなと思います。 (なお、実際には使用しているけど上記では使用していない部分が 含まれていてその部分がない場合もエラーにならないようです)

    • ベストアンサー
    • Perl
  • Perl、オブジェクト指向での初期設定ファイルについて。

    Perl、オブジェクト指向での初期設定ファイルについて。 最近、Perlでのオブジェクト指向を勉強中です。 今までのプログラムをオブジェクト指向に書き直そうと思っています。 クラスを作成して呼び出す程度までは理解できたのですが、 今まで、サーバの絶対パスや、データベースの名称などを、 config.pl というファイルを作って、グローバル変数で宣言していました。 例 $local_parh = "/virtual/xxx/bbb/public_html"; $dbname = "testdb"; $dbuser = "username"; でも、オブジェクト指向では、グローバル変数を使わないようにするということで、 このあたりをふつうはどんなふうに作成するのかとおもったのですが、 なかなか検索しても見つかりません。(検索の仕方が悪いのかもしれませんが) 今思いつく方法は、config.pm などを作って -------------------------------------------------- package Config; sub new{ my $class = shift; my $self= { local_path => '/virtual/aaa/bbb/public_html', dbname => 'testdb', dbuser => 'username' }; return bless ($self,$class); } sub get_local_path { my ($self, $name) = @_; return $self->{'local_path'}; } -------------------------------------------------- use Config; $obj=new Config(); $local_path = $obj->get_local_path(); -------------------------------------------------- とするような感じなのですが、なんだかスマートじゃない気がするので 普通ははどんなふうに書くのか教えてもらえますか?

    • ベストアンサー
    • Perl
  • use baseしたpackageのローカル変数の書き換え

    packageを継承した場合、 継承先(以下のMyPkg)で継承もと(MyBase)のローカル変数($localValue)を直接書き換える方法はありませんか? package MyBase; my $localValue; sub doBase{ my $self=shift; $localValue ={ 'hanako'=>{'id'=>1, 'pref'=>'tokyo'} }; } sub getPref { my $self=shift; my $name=shift; $localValue->{$name}{'pref'}; } package MyPkg; use base qw(MyBase); sub new{ my $class=shift; my $self={}; bless $self, $class; return $self; } sub doAnything { # この中でMyBaseの$localValueを直接書き換えたい $localValue ={ 'taro'=>{'id'=>2, 'pref'=>'osaka'} }; } ------main:: my $pkg=new MyPkg; $pkg->doSomething; print $pkg->getPref('hanako'); $pkg->doAnything; print $pkg->getPref('taro'); ---------- 以下のような感じでmyBaseの中に$localValueを返すサブルーチンを作っておけば、 print $pkg->localValue->{'hanako'}{'pref'}; などと取得は出来ますが、 $pkg->localValue->{'hanako'}{'pref'}='kyoto'; のような代入は無理みたいでした。 package MyBase; my $localValue; sub localValue{ my $self=shift; $localValue; } doBaseのようなサブルーチン経由で書き換えていますが、 use baseしていても、やはりそうしないとダメでしょうか。 Windows、ActivePerl、perl 5.10.0 Linux、Perl5.8

  • オブジェクト指向の実際について。

     初めまして、ラブ・ザ・ゲームといいます。 オブジェクト指向・・・、の理解度は単語だけ知っている、程度だと思います。 クラスを使っている掲示板があるので、さらにシンプルにして、質問させてください。 PHPは4を、想定しています。 Class main_bbs{ //ここはクラスで使う変数の宣言部分ですよね。 var $file ; var $name ; var $title ; var $message ; //ここで、コンストラクタが来ると思います。 function main_bbs(){} //Q1.コンストラクタは、何を初期化すればいいのでしょうか? //次は、データを格納する関数でしょうか。 //Q2.この部分は、クラス内で変数を使うためですよね? function FileInf($file, $name, $title, $message){ $this->file = $file ; $this->name = $name ; $this->title = $title ; $this->message = $message ; } //この掲示板では、チェックを複数に分けています。 //改行変換、危険タグの排除、等。 function Check($str){/* 処理内容 */ return $str; } //これらは、main_bbsクラス内に収まっているのですが、別のクラスに分けた方がいいと思うのですが、積極的にしない理由はありますか? //分ける理由は、その方が汎用性が高まると思うのですが。 //データの成形 function CreateDate(){ $this->name = $this->Check($this->name) ; $this->title = $this->Check($this->title) ; $this->message = $this->Check($this->message) ; } //書き込み処理 function Write(){ CreateDate()を使った後、書き込む処理。 } //書き込み処理も、別のクラスを作った方が、汎用性が高まると思うのですが、積極的にしない理由はありますか? } //呼び出し側、見ているサンプル $main_bbs = new main_bbs ; $bbs -> FileInf($file, $name, $title, $message) ; $bbs -> CreateDate() ; $bbs -> Write() ; ここまでは、参考にしている掲示板の通に書いたつもりです。 ある程度は理解できたと思います。 ・・・が、実際作成する場合、どこから着手すればいいのかが、分かりません。 小さな部分から作っていくって行けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • オブジェクト? perlをオーバーライドする方法?

    perl 5.6を使っております。 Perl5.8では PerlIOが入出力の際に文字コードを自動変換しているのですが この機能を5.6でもスクリプト互換で使いたい(スクリプトを5.6と5.8を同じにする)のですが、 既存のprint, getc, read, write関数をオーバーライド?することは可能でしょうか? 一々、if(5.8 <= $])としたくないためです。 例えば、外部がeucでperl処理がutf8の場合 sub getc{ return Jcode->new(...)->utf8; } sub print{ return Jcode->new(...)->euc; } sub read{ return Jcode->new(...)->utf8; } sub write{ return Jcode->new(...)->euc; }

    • ベストアンサー
    • Perl
  • 同時に二つのファイルにprintする方法

    普通print文は一つのファイルハンドルに出力しますが、それを二つのファイルハンドルに同時に同じ内容を出力する方法はありますか? sub print2 { my $str = shift; print FH1 $str; print FH2 $str; } とすれば一応二つのファイルハンドルに対して出力できますが、print文一つで簡単に済ませる方法があれば知りたいです。 IPC::Open2などがありますが、これは別の目的のものみたいですし・・・ よろしくお願いします。

  • perlのプログラミングについて

    perlのプログラミングについて詳しい解説をお願いいたします。 sub list_reverce{ my $old=shift; my&new=undef; while (my $cur=$old){ $old=$old‐>[NEXT]; $cur‐>[NEXT]=$new; } return $new } 全くの初心者です。連結リストに対してのreverseなのですが、わかりません。 ご回答お願いいたします。

    • ベストアンサー
    • Perl
  • 配列内定義サブルーチン呼び出し

    下記のような配列内定義サブルーチン呼び出しを作成し動作を確認しました。 次にソース2行目の「no strict;」を「use script;」に変更すると Bareword "sub1" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub2" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub3" not allowed while "strict subs" in use at refsub_OK.pl line 4. Execution of refsub_OK.pl aborted due to compilation errors. とエラーになります。 プログラムはやはり「use script;」を記述したいのですが、「use script;」を記述 したままでエラーにならない方法がありましたらおしえてください。 perlのバージョンは5.12.3、OSはWindowsXP SP3です。 よろしくお願いします。 ---ソースここから--- #!perl no strict; use warnings; my @ary = ( ("input1.txt", "save1.txt", sub1), ("input2.txt", "save2.txt", sub2), ("input3.txt", "save3.txt", sub3), ); while (@ary) { my $p1 = shift(@ary); my $p2 = shift(@ary); my $sub = shift(@ary); print "p1=[$p1] p2=[$p2] sub=[$sub]\n"; &$sub("$p1", "$p2"); } sub sub1 { my ($p1, $p2) = @_; print "sub1: [$p1] [$p2]\n"; } sub sub2 { my ($p1, $p2) = @_; print "sub2: [$p1] [$p2]\n"; } sub sub3 { my ($p1, $p2) = @_; print "sub3: [$p1] [$p2]\n"; } ---ソースここまで---

    • ベストアンサー
    • Perl

専門家に質問してみよう