メソッド変更
「オブジェクト指向」ってまだわかりません。とにかく、今やってることがオブジェクト指向に
近い事のようなので、あまり気にせずやっていこうと思います。
モジュールの使い方はわかりました。で、それぞれのメソッド(サブルーチン)だけを取り出して、
使いたいというのもわかりました。
でも、毎回毎回そのメソッド(サブルーチン)と全く同じという訳でもないでしょう。
ということで、今回はモジュールの中のサブルーチン(メソッド)を変更してみたいと思います。
今回使うのは。。。。
- モジュール
Nana.pm
- メインプログラム
blackstones.pl
です。Nana.pmのモジュールのソースはまた後ほど。
では、早速まず何をしたいかと言うと、
まず、面倒な作業は全て、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