WEB相談室

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

タイトル:トップページの文法エラー (Perl)

0:[投稿] なるよし [2006/03/20 15:52 ][URL] [環境:|クライアント|WIN XP Home SP2,Opera8.53(IE6),mail:OE |サーバー|UNIXかLINUX,apache,CGI,PHP,.htaccess]

CGIでトップページ(フレーム)を作ろうとしているのですが…
どうもエラーがでて。調べても調べても異常がないはずですが…
ご指摘お願いします。

# 設定

# 管理者用パスワード(半角英数字)
$pass = '…………';

# ファイルロック形式
#  → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 0;

# ロックファイル名
$lockfile = '.lock';

# memberファイル
$memberfile = ".member";

# linkファイル
$linkfile = ".link";

# END

# ----------------------------------------------------------------------#
#                ページ構成                #
# ----------------------------------------------------------------------#
require './jcode.pl';
require './head.pl';
require './lock.pl';
#require './mp.pl';
#↑携帯用PLfile
&axscheck;
&decode;
if ($page eq "index") { &index; }
elsif ($page eq "left") { &left; }
elsif ($page eq "right") { &right; }
elsif ($page eq "admin") { &admin; }
exit;
# ----------------------------------------------------------------------#

# 上&下ルーチン呼び出し

# ----------------------------------------------------------------------#
#                トップ                    #
# ----------------------------------------------------------------------#
sub index {
        &tops;

    print <<"EOM";
<frameset cols="200,*">
<frame src="index.cgi?page=left" name="hidari">
<frame src="index.cgi?page=right" name="migi">
<noframes>
<BODY oncontextmenu="return false;" onkeydown="return false;" onkeyup="return false;" nselectstart="return false;">
フレーム未対応ブラウザでは、<a href="index.cgi?page=top">トップページ(index.html?page=top)</a>にお入りください。
</body>
</noframes>
</frameset>
</html>
EOM
    exit;
}
# ----------------------------------------------------------------------#
#                メニュー                #
# ----------------------------------------------------------------------#
sub left {
        $title = "メニュー";
        &top;
    print <<"EOM";
<CENTER>
〜ACCESS COUNTER〜<BR>
<img src="daycount/daycount.cgi?to" alt="総計" width="75" height="20"><BR>
12間:<img src="daycount/daycount.cgi?tt" alt="12時間間" width="45" height="20"><BR>
12前:<img src="daycount/daycount.cgi?yt" alt="12時間前" width="45" height="20"><BR>
今日:<img src="daycount/daycount.cgi?td" alt="今日" width="45" height="20"><BR>
先日:<img src="daycount/daycount.cgi?yd" alt="先日" width="45" height="20"><BR>
今週:<img src="daycount/daycount.cgi?tw" alt="今週" width="45" height="20"><BR>
先週:<img src="daycount/daycount.cgi?yw" alt="先週" width="45" height="20"><BR>
今月:<img src="daycount/daycount.cgi?tm" alt="今月" width="45" height="20"><BR>
先月:<img src="daycount/daycount.cgi?ym" alt="先月" width="45" height="20"><BR>
今年:<img src="daycount/daycount.cgi?ty" alt="今年" width="45" height="20"><BR>
先年:<img src="daycount/daycount.cgi?yy" alt="先年" width="45" height="20"><BR>
<HR>
<TABLE>
EOM
    open(IN,"$linkfile");
    while (<IN>) {
        ($ad,$name) = split(/<>/);
        print "<TR><TD><A HREF=\"$ad\">$name</A></TD></TR>;

    }
        close(IN);
    print "</TABLE></CENTER>";
        &under;
exit;
}
# ----------------------------------------------------------------------#
#                内容                    #
# ----------------------------------------------------------------------#
sub right {
}
# ----------------------------------------------------------------------#
#                管理                    #
# ----------------------------------------------------------------------#
sub admin {
    # ログイン画面
    if ($in{'pass'} eq "") {
    $title = "ログイン";
        &top;
        print "<div align=\"center\">\n";
        print "<h4>パスワードを入力してください</h4>\n";
        print "<h4></h4>\n";
        print "<form action=\"$admin\" method=\"post\">\n";
        print "<input type=radio name=mode value=admin checked>記事\n";
        print "<input type=radio name=mode value=setup>設定<br><br>\n";
        print "<input type=password name=pass size=8>\n";
        print "<input type=submit value=\" 認証 \"></form></div>\n";
        print "</body></html>\n";
        exit;
    # 認証
    } elsif ($in{'pass'} ne $pass) {
        &error("パスワードが違います");
    }

    $title = "HP管理(LOG)";
    &top;

    print <<"EOM";
<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『....』起動">
</form>

<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『....』起動">
</form>

<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『....』起動">
</form>

<HR>

EOM

        print "▼<b>ログ一覧</b>\n<table bgcolor=\"#888888\" cellspacing=\"1\">";

        open(IN,"$memberfile");
        while (<IN>) {
            ($date,$host,$addr,$adin,$brow,$lang,$enco,$link) = split(/<>/);
            print "<tr bgcolor=\"#ffffff\"><td>$date</td><td>$host</td></tr><tr bgcolor=\"#ffffff\"><td>$adin</td><td>$addr</td></tr><tr bgcolor=\"#ffffff\"><td>$brow</td><td>$lang</td></tr><tr bgcolor=\"#ffffff\"><td><a href='$link'>$link</a></td><td>$enco</td></tr><tr><td colspan=2>.</td></tr>";

        }
        close(IN);

        print "</table>\n";

    &under;
    exit
}
# ----------------------------------------------------------------------#
#                取得                    #
# ----------------------------------------------------------------------#
sub axscheck {
    # 言語
    $lang = $ENV{'HTTP_ACCEPT_LANGUAGE'};
    # エンドコード対応
    $enco = $ENV{'HTTP_ACCEPT_ENCODING'};
    # リンク元
    $link = $ENV{'HTTP_REFERER'};
    # ブラウザ情報
    $brow = $ENV{'HTTP_USER_AGENT'};
    # 使用可能アドイン
    $adin = $ENV{'HTTP_ACCEPT'};
    # ホスト取得
    $host = $ENV{'REMOTE_HOST'};
    # アドレス取得
    $addr = $ENV{'REMOTE_ADDR'};
    if ($gethostbyaddr && ($host eq "" || $host eq $addr)) {
        $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
    }
    # 時間取得
    $ENV{'TZ'} = "JST-9";
    $times = time;
    ($min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[1..6];
    @week = ('日','月','火','水','木','金','土');

    # 日時のフォーマット
    $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
            $year+1900,$mon+1,$mday,$week[$wday],$hour,$min);

    # ロック開始
    if ($lockkey) { &lock; }
    # 開く
    open(IN,"$logfile");
    @new = <IN>;
    close(IN);
    # 閉じる
    unshift(@new,"$date<>$host<>$addr<>$adin<>$brow<>$lang<>$enco<>$link<>\n");
    open(OUT,">$logfile");
    print OUT @new;
    close(OUT);
    # ロック解除
    if ($lockkey) { &unlock; }
}
sub decode {
    local($buf,$key,$val);
    undef(%in);

    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        $post_flag = 1;
        if ($ENV{'CONTENT_LENGTH'} > $maxData) {
            &error("投稿量が大きすぎます");
        }
        read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
    } else {
        $post_flag = 0;
        $buf = $ENV{'QUERY_STRING'};
    }

    foreach ( split(/&/, $buf) ) {
        ($key, $val) = split(/=/);
        $val =~ tr/+/ /;
        $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

        # S-JISコード変換
        &jcode'convert(*val, "sjis", "", "z");

        # エスケープ
        $val =~ s/&/&amp;/g;
        $val =~ s/"/&quot;/g;
        $val =~ s/</&lt;/g;
        $val =~ s/>/&gt;/g;
        $val =~ s/\0//g;
        $val =~ s/\r\n/<br>/g;
        $val =~ s/\r/<br>/g;
        $val =~ s/\n/<br>/g;

        $in{$key} .= "\0" if (defined($in{$key}));
        $in{$key} .= $val;
    }
    $page = $in{'page'};
    $mode = $in{'mode'};
    $headflag = 0;
    $lockflag = 0;
    $ENV{'TZ'} = "JST-9";
}
# ----------------------------------------------------------------------#
#                エラー                    #
# ----------------------------------------------------------------------#
sub error {
    if ($lockflag) { &unlock; }

    $title = "エラー";
    &top;
    print <<"EOM";
<div align="center">
<hr width=400>
<h3>ERROR !</h3>
<font color="#dd0000">$_[0]</font>
<p>
<form>
<input type=button value="前画面に戻る" onClick="history.back()">
</form>
<p>
<hr width=400>
</div>
EOM
    &under;
    exit;
}


1:[回答] 岩崎 [2006/03/20 18:57 ]

86行目

       print "<TR><TD><A HREF=\"$ad\">$name</A></TD></TR>;

最後の ”が漏れてます。



2:[回答] 通りがかり。 [2006/03/20 18:59 ]

補足ですが、

perl -cw ファイル名

で、デバッグができます。
86行目のエラーなんてのは、こういうものですぐに見つかるはずです。


3:[完了] なるよし [2006/03/20 21:56 ]

ありゃりゃ。
すみません。 -c でしかチェックしないもので…
ご迷惑おかけしました。


4:[質問] なるよし [2006/03/20 22:21 ]

修正しても、動作しない。
少し改造しました。こんな初心者ですが対応お願いします。

# 設定

# 管理者用パスワード(半角英数字)
$pass = 's1.......';

# ファイルロック形式
#  → 0=no 1=symlink関数 2=mkdir関数
$lockkey = "0";

# ロックファイル名
$lockfile = "a.lock";

# memberファイル
$memberfile = "a.member";

# linkファイル
$linkfile = "a.link";

# host取得方式
$gethostbyaddr = "1";

# MAXDATA
$maxData = "10240";

# END

# ----------------------------------------------------------------------#
#                ページ構成                #
# ----------------------------------------------------------------------#
require 'jcode.pl';
require 'head.pl';
require 'lock.pl';
#require 'mp.pl';
#↑携帯用PLfile
&axscheck;
&decode;
if ($page eq "index") { &index; }
elsif ($page eq "left") { &left; }
elsif ($page eq "right") { &right; }
elsif ($page eq "admin") { &admin; }
exit;
# ----------------------------------------------------------------------#

# 上&下ルーチン呼び出し

# ----------------------------------------------------------------------#
#                トップ                    #
# ----------------------------------------------------------------------#
sub index {
        &tops;
    exit;
    print <<"EOM";
<frameset cols="200,*">
<frame src="index.cgi?page=left" name="hidari">
<frame src="index.cgi?page=right" name="migi">
<noframes>
<BODY oncontextmenu="return false;" onkeydown="return false;" onkeyup="return false;" nselectstart="return false;">
フレーム未対応ブラウザでは、<a href="index.cgi?page=top">トップページ(index.html?page=top)</a>にお入りください。
</body>
</noframes>
</frameset>
</html>
EOM
    exit;
}
# ----------------------------------------------------------------------#
#                メニュー                #
# ----------------------------------------------------------------------#
sub left {
        $title = "メニュー";
        &top;
    print <<"EOM";
<CENTER>
〜ACCESS COUNTER〜<BR>
<img src="daycount/daycount.cgi?to" alt="総計" width="75" height="20"><BR>
12間:<img src="daycount/daycount.cgi?tt" alt="12時間間" width="45" height="20"><BR>
12前:<img src="daycount/daycount.cgi?yt" alt="12時間前" width="45" height="20"><BR>
今日:<img src="daycount/daycount.cgi?td" alt="今日" width="45" height="20"><BR>
先日:<img src="daycount/daycount.cgi?yd" alt="先日" width="45" height="20"><BR>
今週:<img src="daycount/daycount.cgi?tw" alt="今週" width="45" height="20"><BR>
先週:<img src="daycount/daycount.cgi?yw" alt="先週" width="45" height="20"><BR>
今月:<img src="daycount/daycount.cgi?tm" alt="今月" width="45" height="20"><BR>
先月:<img src="daycount/daycount.cgi?ym" alt="先月" width="45" height="20"><BR>
今年:<img src="daycount/daycount.cgi?ty" alt="今年" width="45" height="20"><BR>
先年:<img src="daycount/daycount.cgi?yy" alt="先年" width="45" height="20"><BR>
<HR>
<TABLE>
EOM
    open(IN,"$linkfile");
    while (<IN>) {
        ($ad,$name) = split(/<>/);
        print "<TR><TD><A HREF=\"$ad\">$name</A></TD></TR>";

    }
        close(IN);
    print <<"EOM";
</TABLE>
</CENTER>
EOM
        &under;
exit;
}
# ----------------------------------------------------------------------#
#                内容                    #
# ----------------------------------------------------------------------#
sub right {
}
# ----------------------------------------------------------------------#
#                管理                    #
# ----------------------------------------------------------------------#
sub admin {
    # ログイン画面
    $title = "login";
    if ($in{'pass'} eq "") {
        &top;
        print "<div align=\"center\">\n";
        print "<h4>パスワードを入力してください</h4>\n";
        print "<h4></h4>\n";
        print "<form action=\"$admin\" method=\"post\">\n";
        print "<input type=radio name=mode value=admin checked>記事\n";
        print "<input type=radio name=mode value=setup>設定<br><br>\n";
        print "<input type=password name=pass size=8>\n";
        print "<input type=submit value=\" 認証 \"></form></div>\n";
        print "</body></html>\n";
        exit;
    # 認証
    } elsif ($in{'pass'} ne $pass) {
        &error("パスワードが違います");
    }

    $title = "HP管理(LOG)";
    &top;

    print <<"EOM";
<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『ファイルマネージャー』起動">
</form>

<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『...』起動">
</form>

<form action="??" method="post">
<input type=hidden name=pass value="$pass">
<input type=submit value="『...』起動">
</form>

<HR>

EOM

        print "▼<b>ログ一覧</b>\n<table bgcolor=\"#888888\" cellspacing=\"1\">";

        open(IN,"$memberfile");
        while (<IN>) {
            ($date,$host,$addr,$adin,$brow,$lang,$enco,$link) = split(/<>/);
            print "<tr bgcolor=\"#ffffff\"><td>$date</td><td>$host</td></tr><tr bgcolor=\"#ffffff\"><td>$adin</td><td>$addr</td></tr><tr bgcolor=\"#ffffff\"><td>$brow</td><td>$lang</td></tr><tr bgcolor=\"#ffffff\"><td><a href='$link'>$link</a></td><td>$enco</td></tr><tr><td colspan=2>.</td></tr>";

        }
        close(IN);

        print "</table>\n";

    &under;
    exit
}
# ----------------------------------------------------------------------#
#                取得                    #
# ----------------------------------------------------------------------#
sub axscheck {
    # 言語
    $lang = $ENV{'HTTP_ACCEPT_LANGUAGE'};
    # エンドコード対応
    $enco = $ENV{'HTTP_ACCEPT_ENCODING'};
    # リンク元
    $link = $ENV{'HTTP_REFERER'};
    # ブラウザ情報
    $brow = $ENV{'HTTP_USER_AGENT'};
    # 使用可能アドイン
    $adin = $ENV{'HTTP_ACCEPT'};
    # ホスト取得
    $host = $ENV{'REMOTE_HOST'};
    # アドレス取得
    $addr = $ENV{'REMOTE_ADDR'};
    if ($gethostbyaddr && ($host eq "" || $host eq $addr)) {
        $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
    }
    # 時間取得
    $ENV{'TZ'} = "JST-9";
    $times = time;
    ($min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[1..6];
    @week = ('日','月','火','水','木','金','土');

    # 日時のフォーマット
    $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
            $year+1900,$mon+1,$mday,$week[$wday],$hour,$min);

    # ロック開始
    if ($lockkey) { &lock; }
    # 開く
    open(IN,"$logfile");
    @new = <IN>;
    close(IN);
    # 閉じる
    unshift(@new,"$date<>$host<>$addr<>$adin<>$brow<>$lang<>$enco<>$link<>\n");
    open(OUT,">$logfile");
    print OUT @new;
    close(OUT);
    # ロック解除
    if ($lockkey) { &unlock; }
}
sub decode {
    local($buf,$key,$val);
    undef(%in);

    if ($ENV{'REQUEST_METHOD'} eq ("POST" or "GET")) {
        $post_flag = 1;
        if ($ENV{'CONTENT_LENGTH'} > $maxData) {
            &error("投稿量が大きすぎます");
        }
        read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
    } else {
        $post_flag = 0;
        $buf = $ENV{'QUERY_STRING'};
    }

    foreach ( split(/&/, $buf) ) {
        ($key, $val) = split(/=/);
        $val =~ tr/+/ /;
        $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

        # S-JISコード変換
        &jcode'convert(*val, "sjis", "", "z");

        # エスケープ
        $val =~ s/&/&amp;/g;
        $val =~ s/"/&quot;/g;
        $val =~ s/</&lt;/g;
        $val =~ s/>/&gt;/g;
        $val =~ s/\0//g;
        $val =~ s/\r\n/<br>/g;
        $val =~ s/\r/<br>/g;
        $val =~ s/\n/<br>/g;

        $in{$key} .= "\0" if (defined($in{$key}));
        $in{$key} .= $val;
    }
    $page = $in{'page'};
    $lockflag = 0;
    $ENV{'TZ'} = "JST-9";
}
# ----------------------------------------------------------------------#
#                エラー                    #
# ----------------------------------------------------------------------#
sub error {
    if ($lockflag) { &unlock; }

    $title = "エラー";
    &top;
    print <<"EOM";
<div align="center">
<hr width=400>
<h3>ERROR !</h3>
<font color="#dd0000">$_[0]</font>
<p>
<form>
<input type=button value="前画面に戻る" onClick="history.back()">
</form>
<p>
<hr width=400>
</div>
EOM
    &under;
    exit;
}


5:[回答] 通りがかり。 [2006/03/20 22:28 ]

topsっていう関数ってどこにあるんですか?

それと、こういう掲示板で、全部載せるのやめてもらえますか?
ここは、デバッグしてくれるところじゃないんですよ?


6:[お知らせ] なるよし [2006/03/21 06:46 ]

はい、わかりました。
別、ファイルにあります。
`head.pl'に、あります。


7:[回答] 岩崎 [2006/03/21 14:25 ]

もしかして・・・・

#!/usr/local/bin/perl

がないというオチでは?


8:[お知らせ] なるよし [2006/03/21 15:11 ]

それはないです。
でも一応確認しておきますね。


9:[完了] なるよし [2006/03/21 16:09 ]

PLファイルからCGIファイル内にすべてのサブルーチンを入れるといけました。皆さんありがとうございます!

回答(必須): 状態:

お名前(必須):

URL:




[戻る]