CGI-BBS > CGI > Perl > 文法チェックではOKなのに、Server Errorが出ます。どうして??


カレッヂ
カレッヂ


質問者 koba  投稿日 2/14(水) 17:45:51
マジでわかりません。
だれかたすけて〜〜!
ちなみに、csvファイルを読み込もうとしてます。
ソース書いときます。

open(FILE, "cgi.csv");
@logs = <FILE>;
close(FILE);
print "<H3>名簿リスト</H3><UL>";
foreach $data(@logs){
    ($obje, $code, $name, $rete) = split(",", $data);
    print "<LI>対象:$obje, 符号:$code, 名称:$name, 滞留:$rete,<BR>\n";
}
print "</UL>";

ここ以外考えられません。
誰か教えてください。
お願いします!!


回答者 しあわせのツボ  [削除]  投稿日 2/14(水) 19:02:38
Syntax OK が出ているのなら、コードは問題ないと思います(期待した通りに動くかは別として)。

文法チェックはローカルで行いましたか、それともサーバ上で行いましたか?
返ってくるエラーはサーバによるものですか、それともCGIによるものですか?

とりあえずありがちなものを。
設置するディレクトリや拡張子は正しいですか?
パーミッションは正しく設定されていますか?
Content-Type: text/html のヘッダは出力していますか?
質問者 koba  [削除]  投稿日 2/14(水) 19:12:31
返答ありがとうございました。
いらないものを省いて、書き直してみたら
動きました。
何分初心者なもので・・・。open(FILE, "cgi.csv");
@logs = <FILE>;
close(FILE);
foreach $data(@logs){
    ($obje, $code, $name, $rete) = split(",", $data);
    #print "$obje, $code, $name, $rete,\n";
}

・・・このようにしたら、動きました。
ちなみに、文法チェックもエラーも、サーバー上です。

今は、これをループさせようと、四苦八苦してます(笑)
多分、それなりのデーターをはきだす事になると思うのですが、
今の段階では、一行しか表示されないからです。

仕事でperl書いてるんですけど、周りは誰もperl知らないし、
あたしも初心者なので、かなり、へこんでます。

あ、これは、ただの愚痴だった(笑)

ほんとに、初歩的な質問でごめんなさい・・・。
回答者 さくら  [削除]  投稿日 2/15(木) 01:53:11
ローカルマシンで編集している、ファイルの改行コードは、どうなっていますか?
ラインフィード(LF)になっていますか?
\n の事です。

macでは、キャリッジリターン(CR)です。
\r の事です。
winでは キャリッジリターンラインフィード(CRLF)です。
\r\n の事です。

unix サーバーの設定によっては、ラインフィード(LF) になっていないと、
サーバーエラーが発生する場合があるようですよ。
テキストエディタにもよりますが、改行コードをラインフィード(LF)にして見て下さい。



回答者 羊相談員  [削除]  投稿日 2/15(木) 10:26:06
>print "<LI>対象:$obje, 符号:$code, 名称:$name, 滞留:$rete,<BR>\n";

この中にやばい日本語コードを含んでいるものがあるかと思って調べてみましたが、見つかりませんでした。
質問者 koba  [削除]  投稿日 2/15(木) 17:45:13
どこか抜けてるんでしょうか???

open(FILE, "cgi.csv");
@logs = <FILE>;
close(FILE);

@logs = ($data);
$data_count = @logs;

for ($idx = 0; $idx <= $list_count - 1; $idx++) {
($obje, $code, $name, $rete) = split (",",$data);

print <<"EOM";
  <TR>
   <TD height="10" width="34" align="center"><FONT SIZE="2">$obje</FONT></TD>
   <TD height="10" width="77" align="center"><FONT SIZE="2">$code</FONT></TD>
   <TD align="center" height="10" width="308"><FONT size="2">$name</FONT></TD>
   <TD align="center" height="10" width="63"><FONT SIZE="2">$rete</FONT></TD>
  </TR>
EOM
}
回答者 さくら  [削除]  投稿日 2/16(金) 00:39:16
解答します。
まず、貴方の書いたコードでは、貴方の望むような動きはしないでしょう。

最初に気になっている事を一つ、
csvファイルの各行の行末、つまり改行の前にカンマがあるのですか?
あれば、結構ですが、無ければ読み出したデータをchompする必要があるでしょう。
そうしないと、$rete には、改行が含まれている事になる。

貴方の書いたコードで分からない事、
>$data_count = @logs
配列の要素数を調べる為のものだと思うが、$data_countはどこで使っているの?

>@logs = ($data);
これはでは、@logs の内容は、$data の値だけになってしまう。
きっと貴方は$dataを追加したいのでしょう?
それなら、こうするべきです。
配列の最初に追加する場合
unshift @logs, $data;
配列の最後に追加する場合
push @logs, $data;

>$idx <= $list_count - 1
$list_count はなんの値?

まあ、それはそれとして、どうしてもforループで書くならこうするべきでしょう

open(FILE, "cgi.csv");
@logs = <FILE>;
close(FILE);
unshift @logs, $data;   #配列の最初に追加した
for ($idx = 0; $idx < @logs; $idx++) {
$data = shift @logs;
chomp $data;     #改行が有るとしてchompしている
($obje, $code, $name, $rete) = split ",", $data;

print <<"EOM";
  <TR>
   <TD height="10" width="34" align="center"><FONT SIZE="2">$obje</FONT></TD>
   <TD height="10" width="77" align="center"><FONT SIZE="2">$code</FONT></TD>
   <TD align="center" height="10" width="308"><FONT size="2">$name</FONT></TD>
   <TD align="center" height="10" width="63"><FONT SIZE="2">$rete</FONT></TD>
  </TR>
EOM
}

これで、一応OKなのですが、ファイルからデータを読む場合はこういうコードは書かないものだ。私ならこんな風に書く。

open CSV, "cgi.csv" or die;
print "<TABLE>";
while(<CSV>){
        chomp;
        print "<TR>";
        foreach(split /,/){
                print "<TD>$_</TD>";
        }
        print "</TR>\n";
}
print "</TABLE>\n";
close CSV;

これだけで、csvファイルの内容は<TABLE>から</TABLE> の中に出力される。
もし、$dataを追加したいのなら、print "<TABLE>"; の次の行に出力すれば良い。

回答者 羊相談員  [削除]  投稿日 2/23(金) 09:03:37
>貴方の書いたコードでは、貴方の望むような動きはしないでしょう。

ただ単に表示するだけなので大丈夫なんじゃないでしょうか。

返信(回答)する


Web裏技