-1

我是 Perl 的新手,我正在研究 CGI 程序。
我尝试了Perl Monks的以下内容,它可以工作。但我不知道它做了什么。
1) 是什么END_HERE?紧随其后的是HTML?:

print <<END_HERE;   
<html>  
  <head>  
    <title>My First CGI Script</title>  
  </head>  
  <body bgcolor="#FFFFCC">  
    <h1>This is a pretty lame Web page</h1>  
    <p>Who is this Ovid guy, anyway?</p>   
  </body>   
</html>  
END_HERE   

2)我通过添加修改了示例脚本:

my $query = new CGI;  
my $p= $query->param('myparam');  

即新脚本是:

#!C:\perl\bin\perl.exe -wT
use strict;
use CGI;

my $query = new CGI;


print $query->header( "text/html" );

my $time = $query->param('fromDate');

print <<END_HERE;  
   <html>  
     <head>  
       <title>My First CGI Script $time</title>  
     </head>  
     <body bgcolor="#FFFFCC">  
       <h1>This is a pretty lame Web page</h1> 
       <p>Who is this Ovid guy, anyway?</p> 
     </body>  
   </html>  
END_HERE  


# must have a line after "END_HERE" or Perl won't recognize
# the token

它停止工作。我收到以下错误消息:

Undefined subroutine &main::param called at C:/.../test2.cgi line 10.

如果不是这种方式,如何获取浏览器发送的参数?

4

1 回答 1

2
... <<END_HERE ...
foo
bar
END_HERE

方法

... "foo
bar
" ...

终结者的选择取决于您。如果添加引号,则可以使用任何裸词或任何字符串。以下两者都等效于"foo\nbar\n"

<<MEOW
foo
bar
MEOW

<<"And they lived happily ever after."
foo
bar
And they lived happily ever after.

您发布的脚本有两个问题,它们都不会导致您指定的错误。

  1. Perl 无法找到 here-doc 的结尾,因为没有一行仅包含END_HERE. 你有一个包含END_HERE一大堆前导空格,但这不是一回事。删除前导空格。

  2. 它允许在 HTML 中放置任意字符串。转义(例如,使用HTML::Entitiesencode_entities)!考虑如果有人将以下内容传递给fromDate参数会发生什么:

    <script>alert("owned")</script>
    
于 2013-05-12T22:22:22.700 回答