Perl中的Textarea标签

时间:2014-02-25 11:26:01

标签: perl

我想在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>

请帮助!!

2 个答案:

答案 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";
}