我目前有一个名为“test.pl”的脚本,可以执行各种操作并打印出HTML代码以便在网页上查看。我希望它做的一件事是允许用户输入注释,并选择它的注释类型,注释框的处理形式将注释附加到文件中。我不确定我是否正确这样做,因为它似乎没有工作,因为我收到了一些错误..这里是代码的片段:
#!/usr/bin/perl
use warnings;
use CGI qw(:cgi-lib :standard); # Use CGI modules that let people read data passed from a form
#Initiate comment processing
&ReadParse(%in);
if ($in("comment") && $in("type") ! == "") {
$comment = $in("comment");
$type = $in("type");
WritetoFile($comment,$type);
}
sub WritetoFile {
my $input = shift;
my $type = shift;
my $file = "$type" . "_comment.txt";
open (my $fh, '>>', $file) or die "Could not open file '$file' $!";
print $fh "$input\n";
close $fh
}
我使用的形式是:
<FORM ACTION=test.pl METHOD=POST>
Comment:
<INPUT TYPE=TEXT NAME="comment" LENGTH=60>
<P>
Select Type
<SELECT NAME ="type">
<OPTION SELECTED> Animal
<OPTION> Fruit
<OPTION> Vegetable
<OPTION> Meat
<OPTION> Other
<INPUT TYPE=SUBMIT VALUE="Submit"></FORM
任何关于如何使这项工作或甚至改进我正在做的过程的建议都将非常感激!我宁愿保持处理脚本和执行其余子程序的脚本是相同的脚本(测试。 pl)除非这是我必须分开的东西
答案 0 :(得分:1)
您的代码是旧式和新式Perl的奇异组合。您正在使用CGI.pm中的cgi-lib兼容层并使用(自1994年以来不必要的)前导符号调用其ReadParse()函数。另一方面,您使用了三个arg open()和词法文件句柄。我很想知道你是如何发展这种风格的。
您的问题来自您(错误)处理哈希值中的%。您对ReadParse()的调用将所有CGI参数放入散列中,但您使用错误的语法从散列中获取值。使用大括号({ ... }
)查找散列键,而不是括号(( ... )
)。
您对布尔等式运算符也有一些疑惑。 !=
用于数字比较。您希望ne
进行字符串比较。
你可能想要这样的东西:
ReadParse(%in);
if ($in{comment} ne "" and $in{type} ne "") {
$comment = $in{comment};
$type = $in{type};
WritetoFile($comment,$type);
}
您的$comment
和$type
变量是不必要的,因为您可以将哈希查找直接传递到子例程中。
WritetoFile($in{comment}, $in{type});
最后,正如其他人所指出的那样,2014年学习CGI就像学习使用打字机一样 - 它仍然有用,但人们会觉得你很老套。查看CGI::Alternatives了解一些更现代的方法。