我想在perl中做一个textarea / textbox。我有这个标签,但它出现了语法错误。
<textarea name="answer" rows="20" cols="70"></textarea>
我不知道它为什么会出现,我的代码是:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use constant debug=>0;
print "Content-type: text/html\n\n";
# Program: assignment 3
# Author: Jay
# Date: 02/2014
my $cgi= CGI->new();
my $a=$cgi->param('action');
my $num1=$cgi->param('num1');
my $num2=$cgi->param('num2');
my $num3=$cgi->param('num3');
my $num4=$cgi->param('num4');
my $hard=$cgi->param('hardware');
my $soft=$cgi->param('software');
print "$a, $num1, $num2, $num3, $num4" if debug;
if ($a eq undef) {
print "
<!DOCTYPE html>
<html>
<head>
<title>Error Logging</title>
</head>
<body>
<h1>Error Log - IT Support</h1>
<form method=\"post\" action=/~it.jasonc/cgi-bin/assignment3.pl>
<input type=\"hidden\" name=\"action\" value=\"error\">
<table>
<tr><td>Site:</td><td><input type=\"text\" name=\"site\"></td></tr>
<tr><td>Type of Error:</td>
<td><select name=\"error\">
<option value=\"1\">Hardware</option>
<option value=\"2\">Software</option></select></td></tr>
<textarea name="answer" rows="20" cols="70"></textarea>
<tr><td colspan=\"2\"><input type=\"submit\" value=\"Submit Error\"></td></tr>
</table>
</form>
</body>
</html> "
}
if ($hard) {
print "Go to room 1";
}
if ($soft) {
print "Go to room 2";
}
我有另一种类型作为例子
<textarea type=\"text\" name=\"details\" value\rows="4" cols="50">
Please explain the error here!
</textarea>
请帮助!!
杰
答案 0 :(得分:4)
如果使用双引号"
字符引用字符串,则必须在其中转义所有双引号。你逃脱了一些,但不是全部:
...
<option value=\"2\">Software</option></select></td></tr>
<textarea name="answer" rows="20" cols="70"></textarea>
# ^ ^ ^ ^ ^ ^
如您所见,\"2\"
例如已转义,但"answer"
未转义。
处理此字符串的更好方法是使用不同的引号,例如使用qq
,根据您的需要可以使用许多不同的分隔符,例如qq##
:
print qq#
<!DOCTYPE html>
....
您也可以使用heredoc:
print <<EOF;
<!DOCTYPE html>
....
EOF
答案 1 :(得分:0)
行<textarea name="answer" rows="20" cols="70"></textarea>
位于一个大的双引号字符串中。如果你在字符串中放入一个双引号(一个大的多行字符串),你必须通过在它前面加一个反斜杠来逃避它。它在你的代码中的任何地方都可以完成,除非代码中断,其中有6个未转义的双引号。
由于以下文本是HTML而不是perl,因此会出现语法错误。
如果你不想太多关注引用双引号(总是很容易忘记一些),那么当然还有另一种方法(实际上不止一个)。
例如,对于perl字符串,您可以使用qq{}
而不是双引号。然后,如果引号被转义,您的代码将起作用。没什么特别的,它是完全标准的perl。
在一些使用例子中,我在HTML代码中没有取消一些随机引用(在生产代码中,我可能会将它们全部用于避免语法噪声)。
除此之外,仅仅是区别在于打印后使用qq{
并用}
替换双引号结束字符串
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use constant debug=>0;
print "Content-type: text/html\n\n";
# Program: assignment 3
# Author: Jay
# Date: 02/2014
my $cgi= CGI->new();
my $a=$cgi->param('action');
my $num1=$cgi->param('num1');
my $num2=$cgi->param('num2');
my $num3=$cgi->param('num3');
my $num4=$cgi->param('num4');
my $hard=$cgi->param('hardware');
my $soft=$cgi->param('software');
print "$a, $num1, $num2, $num3, $num4" if debug;
if ($a eq undef) {
print qq{
<!DOCTYPE html>
<html>
<head>
<title>Error Logging</title>
</head>
<body>
<h1>Error Log - IT Support</h1>
<form method="post" action=/~it.jasonc/cgi-bin/assignment3.pl>
<input type=\"hidden\" name=\"action\" value=\"error\">
<table>
<tr><td>Site:</td><td><input type=\"text\" name=\"site\"></td></tr>
<tr><td>Type of Error:</td>
<td><select name=\"error\">
<option value=\"1\">Hardware</option>
<option value=\"2\">Software</option></select></td></tr>
<textarea name="answer" rows="20" cols="70"></textarea>
<tr><td colspan=\"2\"><input type=\"submit\" value=\"Submit Error\"></td></tr>
</table>
</form>
</body>
</html>
}
}
if ($hard) {
print "Go to room 1";
}
if ($soft) {
print "Go to room 2";
}