サブルーチンについて

[上に] [前に] [次に]
あゆみ [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
言語取得の初期は(言語に限らず何でもですが)、超簡単な一番短いコードをエディットしながら、実際の動作を把握していくべきと思います。
目標とする機能に最初からスキルゼロで挑むのは、天才以外無理なのでは?

[上に] [前に] [次に]