WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:サブルーチンに引数を渡すには?

0:[投稿] うさうさ [2006/05/03 09:03 ] [環境:IE6,me perl]

はじめまして。1ヶ月近く、模索しましたが、どうしても分からないので、こちらに書き込まさせて頂きます。助けて頂けませんでしょうか?

検索で表示したデータのタイトルをクリックしたら、データの詳細表示が出来るようにしたいのですが、引数をサブルーチンに渡すことが出来ず悩んでいます。NOがクリックで指定したものにならず、データファイルの1番初めのものが表示されてしまいます。アドレスバーには、http://..../....cgi?mode=s_dsp&year=2006&mon=2&no=#131のように指定したnoが表示出来ているのですが。。。。どう記載すればいいのでしょうか?色々検索して、試してみましたが、どうもよく分かりません。

(以下が、作っているcgiです。
コピーで使わせてもらっているもので、余分な記載があるかも?、また、質問に足りない部分があるかもと思いますが、どこの部分を乗せればいいのか分からなかったので、とりあえず、書いておきます。)

##### メイン処理 #####

if ($ENV{'REQUEST_METHOD'} eq "POST") {read(STDIN,$in,$ENV{'CONTENT_LENGTH'});} else {$in = $ENV{'QUERY_STRING'};}
foreach (split(/&/,$in)) {
    ($n,$val) = split(/=/);
    $val =~ tr/+/ /;
    $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $in{$n} = $val;
}
$mode = $in{'mode'};
 ・
 ・
 ・
 ・
if ($mode eq 'search') {&search;}
elsif ($mode eq 'admin') {&admin;}
elsif ($mode eq 's_dsp') {&s_dsp;}
else {&main;}
 ・
 ・
 ・


###
sub search {
    &header;
    print "<body background=\"$bg_img\" bgcolor=\"$bg_color\" text=\"$text_color\"><center>\n";
    print "<table width=97%><tr><td><a href=\"$script\">[Return]</a></td></tr></table>\n";
    print "キーワードを入力し「検索」をクリックして下さい。キーワードを複数指定する場合はスペースで区切って下さい。\n";
    print "<form action=\"$script\" method=POST>\n";
    print "<input type=hidden name=mode value=\"search\">\n";
    print "キーワード <input type=text name=word size=50 value=\"$in{'word'}\">\n";
    print " <select name=year>";
    for (2004 .. $nowyear+1) {
        if ($_ == $logyear) {$sel = ' selected';} else {$sel = '';}
        print "<option value=\"$_\"$sel>$_</option>\n";
    }
    print "</select>年\n";
    print "  <input type=submit value=\" 検索 \"></form>\n";
    if (!$in{'word'}) {return;}

    $in{'word'} =~ s/ / /g;
    @word = split(/\s+/,$in{'word'});
    $m = 0;
    for (1 .. 12) {
        $logmon = $_;
        $logfile = "$base/$logyear$logmon.txt";
        if (!-e $logfile) {next;}
        @data = ();
        open (IN,"$logfile") || &error("OPEN ERROR");
        while (<IN>) {
            $find = 0;
            foreach $word (@word) {if (0 <= index($_,$word)) {$find = 1;} else {$find = 0; last;}}
            if ($find) {push(@data,$_); $m++;}
        }
        close IN;
        if (!$data[0]) {next;}

        print "<table width=750><tr><td><b>$logyear.$logmon</b></td></tr></table>\n";
        foreach (@data) {
                ($no,$rno,$img,$year,$mon,$day,$wday,$nowdate,$name,$mail,$hp,$sub,$com,$img_type,$img_w,$img_h,$img_b,$color,$pwd,$host)  = split(/<>/);
    print "<table width=650 bgcolor=\"$frcolor\" cellspacing=4 cellpadding=0>\n";
    print "<tr><td height=20> <b>$logyear.$logmon.$day<font color=\"$wcolor[$wday]\">($week[$wday])</font></b>  <font color=\"$sub_color\"><b><a href=\"$script?mode=s_dsp&year=$year&mon=$mon&no=\#$no\">$sub</a></b></font></td></tr></table>\n";
        }
    }
    print "検索結果: 計 <b>$m</b>件\n";
}


###
sub s_dsp{

    &header;
    if (-e $logfile) {
        open (IN,"$logfile") || &error("OPEN ERROR");
        while (<IN>) {
            push (@data,$_);
            ($no,$rno,$img,$year,$mon,$day,$wday,$nowdate,$name,$mail,$hp,$sub,$com,$img_type,$img_w,$img_h,$img_b,$color,$pwd,$host) = split(/<>/);
        }
        if ($no eq $in{'no'}) {last;}
        close IN;
    }
    $com =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;
    print "<table width=650 bgcolor=\"$frcolor\" cellspacing=4 cellpadding=0>\n";
    print "<tr><td height=20> <b>$logyear年$logmon月$day日<font color=\"$wcolor[$wday]\">($week[$wday])</font></b>  <font color=\"$sub_color\"><b>$sub/$com</b></font></td>\n";
    if ($mode eq 's_dsp') {
        print "<td align=right><form action=\"$script\" method=\"POST\">\n";
        print "<input type=hidden name=mode value=\"admin\">\n";
        print "<input type=hidden name=pass value=\"$inpass\">\n";
        print "<input type=hidden name=act value=\"edt\">\n";
        print "<input type=hidden name=no value=\"$no\">\n";
        print "<input type=hidden name=year value=\"$logyear\">\n";
        print "<input type=hidden name=mon value=\"$logmon\">\n";
        print "<input type=submit value=\"修正\"></td></form>\n";
    }
    print "</tr><tr><td colspan=2><table width=100% bgcolor=\"$sche_color\" cellspacing=8><tr><td><font color=\"$ftcolor\">$com</font></td></tr></table></td></tr></table>\n";
    print "<table width=630 cellpadding=0><tr><td align=right><a href=\"\#top\">▲top</a></td></tr></table>\n";
}


1:[回答] 通りがかり。 [2006/05/04 01:26 ]

「#」の意味をもう一回おさらいしてみましょう。


2:[回答] うさうさ [2006/05/04 10:00 ]

書き込みありがとうございます。

「#」は、元にした記述に入ってたようで、何故入ってるのかも分からない状態で、理解出来てなくて。
何とか、$script?mode=s_dsp&year=$year&mon=$mon&no=$no
として、#をのけてみましたが、やっぱり、結果はNOのものが表示されません。
何がいけないのでしょう?


3:[回答] 通りがかり。 [2006/05/04 11:10 ]

いろいろ見ているうちに、とてもとても今回の不具合以外に指摘する
ところが多過ぎて、指摘しきれなくなりそうだったので、アドバイス
はやめておきます。

私からのアドバイスは…

>元にした記述に入ってたようで、何故入ってるのかも分からない状態で、理解出来てなくて。

プログラムを一行ずつ追っかけていって、理解できないものがあれ
ば調べること。
逆に全てを把握できないプログラムは使うな。

あと1ヶ月間何やってた?という感じです。
一行一行実験しながら、変数にどんな値が入っているのかを検証す
れば、この程度であれば1週間もあれば、十分作れます。
スキルの問題ではなく、検証の仕方がまずいのでは無いでしょうか。

以上です。


4:[完了] うさうさ [2006/05/04 18:36 ]

「今回の不具合以外」もたくさんあるんですね。いったいなんのことか分からない程度のレベルで、お恥ずかしいです。アドバイスありがとうございました。お時間を割いて頂き、感謝しています。本当にすみませんでした。もっと調べて勉強します。


5:[完了] うさうさ [2006/05/05 16:51 ]

理解出来てないのが恥ずかしくて、早々に完了してしまいましたが、アドバイスの通り「変数にどんな値が入っているのかを検証」してみまして、考え考え試して、なんとか思っていることが出来ました。通りすがり様、本当にありがとうございました。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]