• 締切済み

perl の複雑(?)なクラス定義(データ構造)

以下のようなクラスを作成したいのですが、どのようにクラスとして定義して、どのように呼び出せばよいのでしょうか。特に「score」の部分の記述方法が良く分かりません。 オブジェクト指向(とくにPerl)はあまり経験がない初心者です。 -------------------- データ構造 name addr score--+-- math +-- english +-- science -------------------- クラス記述 package myClass; $ref_score->{math} = '30'; # <-- 正しい? $ref_score->{english} = '40'; # <-- 正しい? # ... sub new { my $class = shift; my $self={}; $self->{name} = 'tanaka'; $self->{addr} = 'tokyo'; $self->{score} = $ref_score; # <-- 正しい? bless $self, $class; } -------------------- メイン文 package main; $inst[0] = myClass::new(); $inst[0]->{name} = "OVERWRITE_NAME"; $inst[0]->{score}->{math} = "OVERWRITE_SCORE_MATH"; print $inst[0]->{module}."\n"; # 出る print $inst[0]->{score}->{math}."\n"; # オーバーライトした値は出るが... print $inst[0]->{score}->{english}."\n"; # 初期値のままの値は表示してくれない... 宜しくお願いいたします。

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

みんなの回答

  • Seravy
  • ベストアンサー率47% (118/249)
回答No.3

他の方が書かれているように、ハッシュを利用すればそのデータ構造は再現できます。 my $hash = { name => "", addr => "", score => { english => "", science => "" } } というように。クラスで使いたければ、クラス変数をこのような構造で作ればいいわけです。 しかし、スクリプトを見たところ、print $inst[0]->{score}->{english}はちゃんと表示されるはずです。。もういちど、自分のスクリプトを良く見直してみてはどうでしょう。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

全体に無茶苦茶だけど, それをおいても「想像した通り」の結果になりますよ. 「初期値のままの値は表示してくれない」ということはないですね. そもそも print $inst[0]->{module}."\n"; # 出る の「出る」の意味がわからんのだけど. module なんてどこでも設定してないよね. 何が「出る」の?

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

個別の誤りを指摘する以前に全体的に無茶苦茶過ぎます。 メソッド(オブジェクト指向)を使う気が無い(理解していない?)のに、オブジェクト指向向けのサンプルを参考にされたんでしょう、きっと。 あなたのやりたい事は、クラスで無くとも単なる Hash でできます。 主目的は、書かれたデータ構造を使用する事か、あなた自身がクラスを勉強したいのかどちらですか?

関連するQ&A

  • インスタンス内から自分のクラス名を取得する方法

    クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。 しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。 素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。 スマートな記述方法あったら教えて下さい。 # self.class.nameを使用する場合 class MyClass  def print_classname   puts self.class.name   # puts class.name これはエラー  end end # type.nameを使用する場合 class MyClass2  def print_classname   puts type.name # これはdeprecatedの記述で警告が出る  end end

  • クラスメンバ・メソッドは継承しない?

    クラスのインスタンスオブジェクトで不変なクラスメンバとメソッドを定義したいのですが、継承クラスでエラーが出ます。 -------------------------------------------------------------------ここから function baseClass() { this.instStr = "base class instance property"; } baseClass.prototype.prtMethod = function(){return this.instStr;}; baseClass.clsStr = "base class property"; baseClass.clsMethod = function(){return baseClass.clsStr;}; base_inst = new baseClass(); alert( "baseClass:\n" + "\tinstStr = " + base_inst.instStr + "\n" + "\tprtMethod = " + base_inst.prtMethod() + "\n" + "\tclsStr = " + baseClass.clsStr + "\n" + "\tclsMethod = " + baseClass.clsMethod() + "\n" ); function upperClass() { this.instStr = "upper class instance property"; } upperClass.prototype = new baseClass; upper_inst = new upperClass(); alert( "upperClass:\n" + "\tinstStr = " + upper_inst.instStr + "\n" + "\tprtMethod = " + upper_inst.prtMethod() + "\n" + "\tclsStr = " + upperClass.clsStr + "\n" + "\tclsMethod = " + upperClass.clsMethod() + "\n" ); /* Exception: upperClass.clsMethod is not a function @Scratchpad:30 */ -------------------------------------------------------------ここまで 実行は Firefox 付属のスクラッチパッドで行いました。 期待する結果は、upperClass.clsStr がベースクラスで設定した"base class property"、upperClass.clsMethod() がその文字列を返す関数となって欲しいのです。 そもそも、Javascript ではクラス定義内部と prototype で設定したメンバとメソッドしか継承できないのでしょうか? あるいは他の方法がある?

  • as3 ムービークリップにビットマップデータを挿入するクラスがうまくい

    as3 ムービークリップにビットマップデータを挿入するクラスがうまくいかない 上記のとおりなんですが、 前提として ■ライブラリにjpgを一枚読み込んで、Photoというクラス名でリンケージしてあります。 ■ステージにmcというムービークリップを配置しています。 mcにビットマップ化したjpgをaddchildしたかったので、 メインフレームに下記を書きました。 -------------------------------------------------------- var name_str:String = "Photo"; var myClass:Class = Class(getDefinitionByName(name_str)); var bmd:BitmapData = new myClass(0, 0); var bm:Bitmap = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; mc.addChild(bm); -------------------------------------------------------- ※今後動的に生成するのでクラス名は変数にしています。 これは問題なく行きました。 上記を外部クラス化したかったので、 下記のようにしました。 ■PhotoClass ---------------------------------------------------------------------- package { import flash.display.MovieClip; import flash.events.Event; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.getDefinitionByName; import flash.display.PixelSnapping; public class PhotoClass extends Bitmap { private var myClass:Class;//クラス名 private var bmd:BitmapData; private var bm:Bitmap; //コンストラクタ public function PhotoClass(_name:String) { myClass = Class(getDefinitionByName(_name)); bmd = new myClass(0, 0); bm = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; init(); } public function init():Bitmap { return bm; } } } ---------------------------------------------------------------------- ■メインフレーム var photoAdd:Bitmap = new PhotoClass("Photo"); mc.addChild(photoAdd); これがうまくいきません。 エラーはないのですが、ちゃんとmcに画像が読み込まれません。。。。 ご教授いただければと思います!

    • ベストアンサー
    • Flash
  • perl言語を使ったHTMLファイルの保存について

    はじめまして。perl初心者の者です。 皆様のお力をかしていただきたく参りました。 以下はあるプログラムの一部なのですが、ここへプログラムを追加し、 ・HTMLファイルを新規作成(ファイル名は毎回違うものをつける) ・5つあるdbg();の中身全てと、$self->{is_spam}の値を書き込む ・ファイルを閉じて/home/user/WWW/へ保存 という形に仕上げたいと思っています。 "#"が先頭にある部分は自分で考えたのですが、これではうまく動いてくれませんでした。間違いがある場所もわからず困っています。どなたかわかる方がいらっしゃいましたら、教えていただきたく存じます。文字数の関係で見づらく申し訳ありませんが、よろしくお願い致します。 #use File::Temp; #$file = mktemp("/home/user/WWW/XXXXXX.html"); # open(IN, "> $file"); $self->{score} = (sprintf "%0.3f", $self->{score}) + 0; dbg("check: is spam? score=".$self->{score}. " required=".$self->{conf}->{required_score}); # print IN "check: is spam? score=$self->{score}"; # print IN "required=$self->{conf}->{required_score}"; dbg("check: tests=".$self->get_names_of_tests_hit()); # print IN "check: tests=$self->get_names_of_tests_hit()"; dbg("check: subtests=".$self->get_names_of_subtests_hit()); # print IN "check: subtests=$self->get_names_of_subtests_hit()"; dbg("check: tests=".$self->get_names_of_tests_hit()); # print IN "check: tests=$self->get_names_of_tests_hit()"; dbg("check: subtests=".$self->get_names_of_subtests_hit()); # print IN "check: subtests=$self->get_names_of_subtests_hit()"; $self->{is_spam} = $self->is_spam(); # print IN "$self->is_spam()"; # close(IN);

    • ベストアンサー
    • Perl
  • XMLのキーと値を取得するには?

    PerlでXMLの処理をしたいのですが、以下のようなXMLをどのようにしたら値が取れるのでしょうか? できれば、Person->Name{'A'}->Seiseki->Englishで50が取得できるような 直感的な方法がうれしいです。 <Person> <Name>A</Name> <Age>29</Age> <Sex>M</Sex> <Seiseki> <English>50</English> <Math>60</Math> <Gymnastic>10</Gymnastic> </Seiseki> <Name>B</Name> <Age>32</Age> <Sex>F</Sex> <Seiseki> <English>60</English> <Math>40</Math> <Gymnastic>50</Gymnastic> </Seiseki> </Person>

    • ベストアンサー
    • Perl
  • パイソンの参考書のプログラムを写したのにエラーが…

    初期化メソッドを持つクラスの定義について、 パイソンの参考書のプログラムを写しただけなのに 何度やっても、どこを探しても原因が分かりません。 プログラムの内容とは別の部分がおかしいんですかね? #以下、問題のプログラムの内容とエラーメッセージ class MyClass2: def _init_(self): self.value = 0 print("a") i3 = MyClass2() i3.value --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-35-d4a47ea99c81> in <module> 5 6 i3 = MyClass2() ----> 7 i3.a AttributeError: 'MyClass2' object has no attribute 'a'

  • Perl文字列置き換えについて

    今日は、PerlとCGIについて、お聞きしたいことがあります。 ~s///;で、文字列の置き換えが出来ますよね? 実行しても、変な数字しか出てこないのです。^^; つまずいてしまいました。 以下、コードです。(プロバイダはぷららです) 実行URL http://www9.plala.or.jp/mura001/form2.html =============================================== #!/usr/local/bin/perl -w require "jcode.pl"; require "cgi-lib.pl"; $host=$ENV{'REMOTE_HOST'}; #IP取得 $addr=$ENV{'REMOTE_ADDR'}; $bo=$ENV{'HTTP_UER_AGENT'}; $http=$ENV{'HTTP_HOST'}; #アクセス元URL $access=$ENV{'HTTP_REFERER'}; &ReadParse; #秒、分、時、日、年、月、曜日 ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime; $mon++; $year += 1900; #曜日を日本語化 @week=('日','月','火','水','木','金','土'); $wday=$week[$wday]; #<input type>のnameを読み込む。 $name = $in{'han'}; $text = $in{'text'}; #日本語レコード &jcode'convert(*name,'euc'); &jcode'convert(*text,'euc'); #文字列置換 $name = ~s/</555/; #改行二つ書かないといけないみたい。 print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body>\n"; print "テストです。<br>\n\n"; if($in{'han'} eq ''){ print "何も入力されていません。<br><br>\n"; exit(); } print "貴方が入力した名前は $name ですね。<br><br>\n\n"; print "$text<br><br>\n\n"; print $ENV{'PATH'},"<br><br>\n\n"; &file2(); print "書き込みリスト<br><br>\n\n"; &file(); print "</body>\n"; print "</html>\n"; sub file{ open(IN,"test.txt"); while(<IN>){ print; } close(IN); } sub file2{ open(IN,">>test.txt"); print IN "<hr>訪問者:$name $year年$mon月$mday日($wday)$hour:$min:$sec<br><br>\n\n"; print IN $text,"<br><br>"; print IN "IPアドレス:$addr<br><br>\n\n"; print IN "アクセス元:<a href=\"$access\">$access</a><br><br><hr>\n\n"; close(IN); } ========================== $name = ~s/</555/; が、 4294967295 にどうしてもなります。^^; (置き換え後の文字列を他のに変更しても必ず、 4294967295 になります!) 分かる方、いらっしゃいますか? あと、日本語の変換が出来ません。(汗) それと、ぷららのサーバがかなり重たいのですが、どうすれば宜しいでしょうか? ご迷惑をおかけいたしますが、どうか、宜しくお願いいたします。

  • php クラス

    クラスの勉強をしているのですが、 記憶寿命をfunctionの中で完結させsample2以降でも同じ変数などを使えるようにするため定義済み関数内でクラスを処理したいのですが下記のエラーが出てしまいます。 functionの中でクラスを簡潔させるにはどのようにすればよいでしょうか?また、これはなぜエラーが起きているのでしょうか? function sample1(){ $pr=new parson; $pr->name="鈴木"; $pr->age=56; print $pr->getname(); print $pr->getage(); class parson { public $name="鈴木"; public $age=56; function getname(){return $this->name;} function getage(){return $this->age;} }} sample1(); Fatal error: Uncaught Error: Class 'parson' not found in hoge/class.php:11 Stack trace: #0 /hoge/class.php(27): sample1() #1 {main} thrown in /hoge/class.php on line 11

    • ベストアンサー
    • PHP
  • perlのソケット通信について

    perlのソケット通信でwebブラウザーのようなものを製作中なのです。 http://tohoho.wakusei.ne.jp/wwwperl2.htm#socketを参考にしたのですが、 yahooは表示されますが、xrea系のサイトのような特定のサイトが閲覧できず(どちらかというと特定のサイトのみ閲覧できる)、NotFoundかDNSエラーになります。 とほほのWWW入門のサンプルの他に追加する項目などはあるのでしょうか?よろしくお願いします。 現在の構文は以下の通りです browser.cgi 改行コードLF、漢字コードEUC ------------- #! /usr/bin/perl print "Content-type:text/html\n\n"; $addr = (gethostbyname("www.xrea.com"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, 2, 1, 0); connect(S, $name); binmode(S); select(S); $| = 1; select(stdout); print S "GET /index.php HTTP/1.0\n\n"; while (<S>) { print; } close(S);

    • ベストアンサー
    • Perl
  • インターフェイス 抽象クラス

    PHP初心者です。 xampp1.7.0(最新)でアパッチなど一括ダウンロード クラスの概念は分かりましたが、インターフェイス、及び抽象クラスについて理解が追い付きません。 下記コードをご覧ください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <? abstract class AbstractClass { abstract public function test1(); } class Impl1 extends AbstractClass { public function test1() { print "こんにちは\n"; } } class Impl2 extends AbstractClass { public function test1() { print "ありがとう.\n"; } public function hoge() { print "さようなら\n"; } } $i1 = new Impl1(); $i1->test1(); $i2 = new Impl2(); $i2->test1(); ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 抽象クラスが上にありますが、中身がないので継承し、そのクラスの中で処理させています。抽象クラスの必然性が理解できません。まあこのコード事態がものすごく短いので、その必然性がないと思うのですが、例えばもっと長いコードになったときなどは抽象クラスは絶対使った方がいいということになるのでしょうか。 さらに全て抽象クラスであればインターフェイスを利用できるようですが、インターフェイスのメリットにつき理解が追い付きません。 どなたかご教授お願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう