2014-02-25 39 views
0

我想在perl中做一个textarea/textbox。我有这个标签,但它是语法错误。Perl中的Textarea标记

<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

,因为它似乎你应该总是张贴你得到确切的错误,完整,同时也标志着您的代码中的行号。 – TLP

回答

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 
+0

是的,我了解双引号“字符,但我让我的朋友检查双引号(他是perl的专家),他说我已经逃过了所有双引号。@TLP – Jason

+2

你的朋友错了,这些双引号不会被转义,你可以通过在它们之前放置一个反斜杠来转义字符,所以'\“'会被转义,'''不是。 – TLP

0

<textarea name="answer" rows="20" cols="70"></textarea>位于一个大的双引号字符串中。如果你在字符串(一个大的多行字符串)中放一个双引号,你必须在它之前加一个反斜杠来转义它。它在你的代码中的任何地方都可以完成,除非你的代码中断了,那里有6个未引号的双引号。

由于以下文本是HTML而不是perl,因此会出现语法错误。

如果你不想太在意引用双引号(它总是容易忘记一些),当然有另一种方法来做到这一点(实际上是多个)。

你可以例如使用qq{}而不是双引号的perl字符串。然后你的代码将工作,如果报价逃脱或没有。没什么特别的,它是完美的标准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"; 
}