サブルーチンについて
[上に]
[前に]
[次に]
あゆみ
[E-Mail]
1999/10/25(月) 00:46:20
perlでの、サブルーチンの書き方がわかりません。
今したいことは選択されたフォームの集計です。
たとえば、
まず、htmlで、
<FORM ACTION='vote.cgi' METHOD='POST'>
設問1<br>
<SELECT NAME='Q1'>
<OPTION VALUE="0" SELECTED>答え1
<OPTION VALUE="1">答え2
<OPTION VALUE="2">答え3
</SELECT>
設問2<br>
<SELECT NAME='Q2'>
<OPTION VALUE="0" SELECTED>答えA
<OPTION VALUE="1">答えB
<OPTION VALUE="2">答えC
</SELECT>
<INPUT TYPE=SUBMIT VALUE="結果">
</FORM>
とあるとします。
この答えを投票数をカウントして出力したいのです。
ひとつの設問ならうまくいくのですが、
2つ以上になるとどうもうまくいきません。
vote.cgiの一部は以下のとおりです。
if (&lock) {
open(DB,"$datafile") || die "Can't open data file.\n";
@DATA = <DB>;
close(DB);
# 投票数の集計と記録
$total = 0;
$i = 0;
foreach $line (@DATA) {
chop($line);
$cnt[$i] = $line;
if($option eq $i) { $cnt[$i]++; }
$total = $total + $cnt[$i];
$DATA[$i] = "$cnt[$i]\n";
$i++;
}
open(DB,">$datafile") || die "Can't open data file.\n";
print DB @DATA;
close(DB);
#出力
print "<TABLE BORDER ALIGN=CENTER HEIGHT=64><TR>\n";
$i = 0;
while ($i <= $#Name) {
if ($cnt[$i] > 0) {
print "<TD ALIGN=CENTER BGCOLOR=$bgc[$i] WIDTH=";
print int(($cnt[$i] / $total) * $length);
print "><B>$Name[$i] $cnt[$i]</B></TD>\n";
}
$i++
}
print "</TR></TABLE>\n";
print "計 $total\n";
これを繰り返して記述すればいいのでしょうが、
設問が多くなるとperlが長くなりすぎるので、
サブルーチンか何かで処理したいのです。
いろいろ調べたのですが、
サブルーチンに関してはまったく理解できなかったので、
基本的なこと(サブルーチンの呼び出し方や、記述の仕方など)も
お願いいたします。
長くすみません。
下級天使
1999/10/25(月) 16:35:19
>基本的なこと(サブルーチンの呼び出し方や、記述の仕方など)も
>お願いいたします。
以下に サブルーチン呼び出し方&定義の仕方のサンプルを記述します。
---> サンプルここから
#!/usr1/CADnet2/LDM/perl -w
local(@a) = ("abc", "def", "ghi", "jkl", "mno");
# サブルーチンの呼び出し方
# 以下で定義した func サブルーチンを呼び出します。
# func を呼び出す際に、 @a を引数として渡します。
&func(@a);
#------ メイン終了
#
# ■サブルーチンを定義する。
# funcという名前の サブルーチンを定義する。
#
sub func {
local(@x) = @_; # 引数を受け取る
# 受け取った配列を print する。
foreach $aref (@x) {
print "x array = $aref\n";
}
}
#------ EOF ------
---> サンプルここまで
とほほさんの
http://www.tohoho-web.com/wwwperl1.htm#Subroutine
に、サブルーチンについて記載されてます。
B-Cus
1999/10/25(月) 22:54:24
そもそもサブルーチンがどうこうというより、
> これを繰り返して記述すればいいのでしょうが、
という結論に至ることがおかしいような。
ログファイルへの記録形式が悪い(非効率的)のではないかと思います。
Q ごとに別ファイルにしてるんですか? サブルーチンで書いてもいいですけど、
ループで囲むことはできないんですか?
J.Naka
1999/10/26(火) 12:26:12
言語取得の初期は(言語に限らず何でもですが)、超簡単な一番短いコードをエディットしながら、実際の動作を把握していくべきと思います。
目標とする機能に最初からスキルゼロで挑むのは、天才以外無理なのでは?
[上に]
[前に]
[次に]