メソッド変更

オブジェクト指向」ってまだわかりません。とにかく、今やってることがオブジェクト指向
近い事のようなので、あまり気にせずやっていこうと思います。

モジュールの使い方はわかりました。で、それぞれのメソッド(サブルーチン)だけを取り出して、
使いたいというのもわかりました。
でも、毎回毎回そのメソッド(サブルーチン)と全く同じという訳でもないでしょう。
ということで、今回はモジュールの中のサブルーチン(メソッド)を変更してみたいと思います。

今回使うのは。。。。

  • モジュール

  Nana.pm

  • メインプログラム

  blackstones.pl

です。Nana.pmのモジュールのソースはまた後ほど。

では、早速まず何をしたいかと言うと、

「フォームから入力して、それをHTMLで表示する」
ということをしようと思います。
まず、面倒な作業は全て、Nana.pmがしてくれます。文字コード変換、テンプレート作成、
フォームの値ゲット。だから、な〜んにもしなくても、全部モジュールがしてくれるので、
その時のblackstones.plのソースは、モジュール使うぜ!って書くだけ。
あら〜便利♪

そこまでは、前回のことを見たらできると思うので省略。
で、本題に入りましょう。

「もし、フォームが空だったら、エラーページを表示する。空じゃなかったら、入力した値を表示する」

よし、では早速取りかかりましょう!!!

まず、上の分岐を作る場所は、Nanaモジュールの中でフォームから送られてきた値を取り込む場所ですよね。
「もし、取ってきたけどなにも入ってなかったら」っていう感じで書けばいいわけです。
それが書いてあるのが、Nana.pmのstartというメソッド(サブルーチン)です。
ひとまず、現在そこに何が書かれているか書いてみます。

Try1

sub start{
  my $self = shift;  #第一引数引き渡し
  my @message;   #エラーを入れるメッセージ配列
  
  my $query = new CGI; #CGIモジュールを使って、フォームデータを
             #$queryに入れる。
  $self->{query} = $query; #CGIモジュールで使える形に変更

  #euc変換
 $self->query_euc_proc($self->{zyogai_key}); #query_euc_procという
                       #サブルーチンを呼び出している。

   return @message;

こんな感じです。突然モジュールの中身だけみたので訳が分からない思うのですが、
必要ない部分は気にしないで♪

my $query = new CGI;

CGIモジュールを使ってフォームの値を取ってきています。それを$queryに代入。

$self->{query} = $query;

$selfを付けないとモジュールの中で使えませんよね。
なので、$self->{query}という形に無理矢理変えています。
で、その後EUCに変換するためのサブルーチンに値を渡しています。

と、今はこういった流れになっている訳です。

では、続いてこの部分を変更する作業にはいります。

まず、Nana.pmの中のサブルーチン(クラス)を書き換えるには、別のモジュールを作らなくてはいけません。
どういうことかというと、Nana.pmを親モジュール、書き換えるサブルーチンがあるモジュールを子モジュールという考え方をします。そうしないと書き換えることはできません。
ということで、早速作ってみましょう。

package Hachi;

さ、これでできましたよw簡単です♪
これは、blackstones.plの中に、メインの処理なんかと一緒に書いてしまっていいです。
下の方にまとめて書きましょうね。

で、書き換えるサブルーチン(クラス)以外は元のものを使いたいですよね。
全部書き換えたりしたくないですし。なので、元も使うよ、ってことを書きます。

use base qw(Nana.pm);

こう書きましょう。これは、「Nana.pmを元(親)として使いますよ」っていう意味です。

そしてその下にいよいよ書き換える部分のサブルーチンを書き始めます。
もとをさらっとコピーして貼付けちゃいましょう。

sub start{
  my $self = shift;  #第一引数引き渡し
  my @message;   #エラーを入れるメッセージ配列
  
  my $query = new CGI; #CGIモジュールを使って、フォームデータを
             #$queryに入れる。
  if($query eq ""){          #もし空だったら、

	push(@message,'エラーです。');   #@messageに、「エラーです」と入れる。

	} else {      #空じゃなかったら、前の処理と一緒

        $self->{query} = $query; #CGIモジュールで使える形に変更
	#euc変換
	$self->query_euc_proc($self->{zyogai_key});

	} 

  return @message;
}

さっきは、CGIモジュールを使って、「フォームデータを$queryにいれる」→「EUCに変換」という流れでした。
この二つの流れの間に、「もし、$queryが空だったら。。。」っていうのを入れたいですよね。
なので、$queryにデータを入れたときにその処理を追加してみました。

さて、どうでしょう???

結果1

error

がーん。エラーだ。完璧だと思ったのに!!!

あ、そうか。

if($query eq ""){ 

これじゃだめだ。
フォームの名前を、namaeとしたので、それを直接指定しなきゃ。

$query->param('namae') eq "0"

こう書けばいいわけだ。
そのためには、

 $self->{query} = $query; #CGIモジュールで使える形に変更

この部分はifの外に出さなきゃ。空でも空でなくても、先にこの形が使えるようにしておこう。

ということで、やりなおし。

try3

sub start {
	my $self = shift;
	my @message;
	
	my $query = new CGI;
	$self->{query} = $query; #ifの外に出す
	
	if($query->param('namae') eq ""){ #直接値を指定
		push(@message,'エラーです。');
	} else {
		#euc変換
		$self->query_euc_proc($self->{zyogai_key});
              #外に出したので、空じゃなかったら、EUC変換のみすればよし。
	}
	return @message;
}

よし!!!これでできた!これでどうだっ!!!

結果2

「エラーです。」

やりました!!!!!!
完成〜〜〜〜♪♪

でもsjis表示ができない。。。どうしたらいいんだろ??汗
それはまた次回w