Perl:简单表单提交会将URL追加到当前URL

Perl:简单表单提交会将URL追加到当前URL,perl,cgi,Perl,Cgi,所以。我是perl新手。这个简单的脚本只需要创建一个具有指定维度的表,显示数字,就像在times表中一样。我试图通过记录路径信息来记录脚本的刷新次数,如:script.cgi/1 除非刷新,否则它会执行以下操作: script.cgi(首次使用) script.cgi/1 script.cgi/1/script.cgi/2 为什么会发生这种情况 脚本: #!/usr/bin/perl use warnings; use strict; BEGIN { $| = 1; open

所以。我是perl新手。这个简单的脚本只需要创建一个具有指定维度的表,显示数字,就像在times表中一样。我试图通过记录路径信息来记录脚本的刷新次数,如:script.cgi/1

除非刷新,否则它会执行以下操作: script.cgi(首次使用) script.cgi/1 script.cgi/1/script.cgi/2

为什么会发生这种情况

脚本:

#!/usr/bin/perl

use warnings;
use strict;

BEGIN {
    $| = 1;
    open(STDERR,">&STDOUT");
    print "Content-type:text/html\n\n";
}

print "<html>\n<head>\n<title>Homework 5</title>\n</head>\n<body>\n";
print "<h1>Homework 5B</h1>\n<hr />\n";
if(defined($ENV{'CONTENT_LENGTH'}))
{
    my %FORM;
    my $buffer = {};
    read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
    my @pairs = split(/&/,$buffer);
    my $name=0; my $value=0;
    foreach my $pair (@pairs)
    {
        ($name,$value) = split(/=/,$pair);
        $FORM{$name} = $value;
    }
    if($ENV{'CONTENT_LENGTH'}>0)
    {
        my @table = [];
        my $var1 = $FORM{'rows'};
        my $var2 = $FORM{'columns'};
        if(
            (!($FORM{'rows'} =~ m/[^0-9]/)) 
            && (!($FORM{'columns'} =~ m/[^0-9]/)) 
            && (!($FORM{'inc'} =~ m/[^0-9]/)) 
            && (!($FORM{'start'} =~ m/[^0-9]/))
        )
        {
            my $place = $FORM{'start'};
            my $i=-1;
            while($i++ < $var1)
            {
                my $j=-1;
                $table[$i] = [];
                while($j++ < $var2)
                {
                    $table[$i][$j] = $place;
                    $place+=$FORM{'inc'};
                }
            }
        }
        print "<table border=1>\n";
        my $var =0; my $before = "<td>"; my $after = "</td>";
        for(my $i=0;$i<$FORM{'rows'};$i++)
        {
            $var = $i+1;
            print "<tr><td>Row $var:</td>\n";
            for(my $j=0;$j<$FORM{'columns'};$j++)
            {
                my $pr = $before.($table[$i][$j]).$after; 
                print $pr;
            }
            print "</tr>\n";
        }
        print "</table>\n";
        my $refreshed = 0;
        if(defined($ENV{'PATH_INFO'}))
        {
            my $tmp = split(/\//,$ENV{'PATH_INFO'});
            $refreshed = $tmp;
            if($refreshed==1)
            {
                print "<p>This page was refreshed by this script one time.</p>\n";
            }
            elsif($refreshed>1)
            {
                print "<p>This page was refreshed by this script $refreshed times</p>\n";
            }
        }
        my $path = "";
        my $next = $refreshed+1;
        if($next>1)
        {
            $path = "hw5B.cgi/".$next."/";
        }
        else
        {
            $path = "hw5B.cgi/1/";
        }
        print "<p>$path</p>\n";
        print "<form method=\"post\" action=\"$path\">\n";
        print "<span>Enter row number:<input type=\"text\" name=\"rows\" size=3 value=$FORM{'rows'} /></span><br />\n";
        print "<span>Enter columns number:<input type=\"text\" name=\"columns\" size=3 value=$FORM{'columns'} /></span><br />\n";
        print "<span>Enter starting number:<input type=\"text\" name=\"start\" size=3 value=$FORM{'start'} /></span><br />\n";
        print "<span>Enter increment:<input type=\"text\" name=\"inc\" size=3 value=$FORM{'inc'} /></span><br />\n";
    }
    else
    {
        print "<form method=\"post\" action=\"hw5B.cgi\">\n";
        print "<span>Enter row number:<input type=\"text\" name=\"rows\" size=3 /></span><br />\n";
        print "<span>Enter columns number:<input type=\"text\" name=\"columns\" size=3 /></span><br />\n";
        print "<span>Enter starting number:<input type=\"text\" name=\"start\" size=3 /></span><br />\n";
        print "<span>Enter increment:<input type=\"text\" name=\"inc\" size=3 /></span><br />\n";
    }
}
else
{
    print "<form method=\"post\" action=\"hw5B.cgi\">\n";
    print "<span>Enter row number:<input type=\"text\" name=\"rows\" size=3 /></span><br />\n";
    print "<span>Enter columns number:<input type=\"text\" name=\"columns\" size=3 /></span><br />\n";
    print "<span>Enter starting number:<input type=\"text\" name=\"start\" size=3 /></span><br />\n";
    print "<span>Enter increment:<input type=\"text\" name=\"inc\" size=3 /></span><br />\n";
}
print "<input type=\"submit\" value=\"submit\" />\n";
print "</form>\n</body>\n</html>\n";
#/usr/bin/perl
使用警告;
严格使用;
开始{
$| = 1;
打开(标准字符“>”和标准字符“);
打印“内容类型:text/html\n\n”;
}
打印“\n\n家庭作业5\n\n\n”;
打印“家庭作业5B\n
\n”; if(已定义($ENV{'CONTENT_LENGTH'})) { 我的%表格; 我的$buffer={}; 读取(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); my@pairs=split(/&/,$buffer); 我的$name=0;我的$value=0; foreach my$pair(@pairs) { ($name,$value)=拆分(/=/,$pair); $FORM{$name}=$value; } 如果($ENV{'CONTENT_LENGTH'}>0) { 我的@table=[]; my$var1=$FORM{'rows'}; my$var2=$FORM{'columns'}; 如果( (!($FORM{'rows}=~m/[^0-9]/) &&(!($FORM{'columns}=~m/[^0-9]/) &&(!($FORM{'inc}=~m/[^0-9]/) &&(!($FORM{'start}=~m/[^0-9]/) ) { my$place=$FORM{'start'}; 我的$i=-1; 而($i++<$var1) { 我的$j=-1; $table[$i]=[]; 而($j++<$var2) { $table[$i][$j]=$place; $place+=$FORM{'inc'}; } } } 打印“\n”; my$var=0;my$before=“”;my$before=“”; 对于(我的$i=0;我的$i1) { 打印“此页面由此脚本刷新$refreshed times

\n”; } } 我的$path=“”; my$next=$refreshed+1; 如果($next>1) { $path=“hw5B.cgi/”$next./”; } 其他的 { $path=“hw5B.cgi/1/”; } 打印“$path

\n”; 打印“\n”; 打印“输入行号:
\n”; 打印“输入列号:
\n”; 打印“输入起始编号:
\n”; 打印“输入增量:
\n”; } 其他的 { 打印“\n”; 打印“输入行号:
\n”; 打印“输入列号:
\n”; 打印“输入起始编号:
\n”; 打印“输入增量:
\n”; } } 其他的 { 打印“\n”; 打印“输入行号:
\n”; 打印“输入列号:
\n”; 打印“输入起始编号:
\n”; 打印“输入增量:
\n”; } 打印“\n”; 打印“\n\n\n”;
您在post方法中使用了相对路径。因此,每次服务器都会附加到当前路径。您可以放置一个绝对路径,这将缓解问题,或者您可以将此计数器作为cgi参数而不是包含在路径中

<input type="hidden" name="counter" value="$counter">

此外,为了让您的生活更轻松,我建议您使用另一种双引号分隔符,这样您就不必转义html中的所有双引号:

print qq{<form method="post" action="hw5B.cgi">\n};
打印qq{\n};

第69行出现语法错误:全局符号“$tmp3”需要显式的包名。可能只希望是$tmp;2014年。为什么要使用CGI编写web应用程序?你为什么不用CGI.pm来编写CGI程序?你从哪里得到建议的?我。。。我在上一堂过时的perl实践课。我想如果我学习核心perl功能,这不会是浪费。