我有一个perl脚本,它从html文件传递参数,然后将该参数打印到该文件

时间:2014-04-30 19:37:44

标签: perl

所以我编写了一个perl脚本来传递HTML文件中的参数,然后获取参数的vaule并将其写入文件,然后读取文件并编译数据。这是html文件的正文:

    <!DOCTYPE html>
<!DOCTYPE html>
<html lang = "en">
<head>
<title> poll.html </title>
<meta charset = "utf-8" />
<style type = "text/css">     
</style>
</head>
<!-- the quiz -->
<body>
<form action = "../cgi-bin/poll.pl" method = "post">
</h1> this is a poll<br><br>What is your favorite color?</h1>
<input type="radio" name="color" value="red">Red<br>
<input type="radio" name="color" value="green">Green<br>
<input type="radio" name="color" value="blue">Blue<br>
        <input type = "submit"  value = "Submit Quiz" />

    </form>
</body>
</html>

然后我有我的perl脚本一切正常但是一旦我打开我的文件我失去了$ color的值我尝试使$ color成为全局可变量但是同样的错误发生了(在连接中使用未初始化的值$ color(。)或者在poll.pl第19行的字符串。)这里是perl脚本:     #!/ usr / bin / perl -w

# processOrder.pl
use CGI ":standard";
use strict;
use warnings;
print header;
print start_html("Pizza Places Order Form");
#Set local variables to the parameter values 
our($color)=param("color");
my $filename = 'data.txt';
open(my $fh, '+>>', $filename) or die "Could not open file '$filename' $!";
print $fh "'$color'\n";
my $red = 0;
my $blue = 0;
my $green = 0;
while( my $line = <$fh>)  {   
    if (index($line, "red\n") != -1) {
    $blue = $blue + 1;} 
if (index($line, "blue\n") != -1) {
    $blue = $blue + 1;}
if (index($line, "gren\n") != -1) {
    $green = $green + 1;}
}
my $total = $red + $green +$blue;
if ($total == 0){
$total = 1}
print  h4("percent blue = ", $blue/$total, "\n");
print  h4("percent green = ", $green/$total,  "\n");
print  h4("percent red = ", $red/$total, "\n");
close $fh; 

最后警告我是perl的新手,但我确实认为这个逻辑是合理的,任何帮助都会很棒。谢谢

2 个答案:

答案 0 :(得分:0)

您的脚本存在许多问题。以下是三个主要的:

  1. 您将文本附加到文件的末尾,然后尝试读取文件的内容。问题是您的读取光标位于文件的末尾,因此您什么都不读。在尝试读取之前,需要将读取光标重置为文件的开头。使用seek $fh, 0, 0;
  2. 您将'blue'附加到该文件,但您将其与blue进行比较(您错过了单引号)。你永远不会得到任何比赛。
  3. 您测试该行是否与red\n匹配,如果匹配,则会增加$blue

答案 1 :(得分:0)

我知道这是一个较旧的线程,但我注意到的一件事是你没有使用chomp。当您从stdin(或从表单或其他)读取并想要将其与字符串进行比较时,最好先选择($ var)来删除换行符。如果没有换行符,那么该函数什么都不做(与chop()不同,它会删除最后一个字符而不管它是什么。)

所以这个:

if (index($line, "red\n") != -1) {

会变成这样:

if (index(chomp($line), "red") != -1) {

这不是什么大不了的事,但如果您不确定是否有新行,那么这是一个很好的做法。如果您正在读取的字符串位于文件末尾并且不存在换行符,则尤其如此,这在* nix环境中至少相当常见。