您应该了解print
(或任何其他功能的工作方式):
1)这是一个例子:
use strict;
use warnings;
use 5.020;
use autodie;
use Data::Dumper;
use DBI;
sub do_stuff {
print "xxx\n";
}
print "goodbye\n", do_stuff, "\n";
你认为 perl 会首先输出什么?字符串“goodbye\n”还是字符串“xxx”?换句话说,该 print 语句是否等同于:
print "goodbye\n";
print dostuff;
print "\n";
???
2)这是另一个例子:
print "hello", die("Too tired too print anything else...");
你认为输出会是什么?die()
使您的程序立即终止并在退出前输出指定的消息。
The rule
is:函数的参数必须在函数本身执行之前完全确定。因此,在您编写的 perl 脚本中:
print $q->header,
...这是正确的,因为您必须先输出响应标头。但是还有那个尾随的逗号。你继续你的印刷声明:
print $q->header, $q->start_html(), print $q->div()
该声明相当于:
print(
$q->header,
$q->start_html(),
print($q->div)
)
好的,应用规则:在print()
确定三个参数中的每一个之前,外部不会执行。因此,perl 执行$q->header
,它返回一个字符串。规则 #2 是:代码中的所有函数调用都替换为函数的返回值。这给了你:
print(
"some http response info,
$q->start_html()
print($q->div)
)
接下来,perl 执行$q->html
,它也返回一个字符串,给你:
print(
"some http response info",
"<html> blah blah",
print($q->div)
)
最后,评估第三个参数,print($q->div)
。第三个参数等价于print("<div>...")
,给你:
print(
"some html response stuff",
"<html> blah blah",
print("<div...")
)
正如我在回答开头的前两个示例所展示的那样,内部 print() 将在外部 print 能够打印前两个参数之前执行。因此,您最终不会首先输出标题,因此您的错误。 print("<div...")
实际上在输出字符串后返回 1,所以你最终得到:
print(
"some html response stuff",
"<html> blah blah",
1
)
现在外部打印终于可以执行了。
我正在为我的服务器使用 Apache,您的 perl 脚本位于此处:
apache2/cgi-bin/perl2.pl
用于检索脚本输出的 url:
http://localhost:8080/cgi-bin/perl2.pl
我在这里放了一个css文件:
apache2/cgi-bin/htdocs/css/my.css
通常,我可以在不指定 htdocs 目录的情况下检索 htdocs 中的 html 页面,因此:
http://localhost:8080/page.html
因此,从 cgi-bin 目录到 htdocs 目录中文件的路径很简单:
../css/my.css (rather than ../htdocs/css/my.css)
这是您的代码,其中包含访问 css 文件所需的所有更改:
use strict;
use warnings;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
my $q = new CGI;
print(
$q->header,
$q->start_html(
-title => 'Input Request',
-style=>{-src=>"../css/my.css"} #<==THIS CREATES A LINK TAG
),
$q->div(
{-id=>"divtop"},
$q->p("Here's a paragraph")
),
$q->start_form(
-method=>'post'
),
$q->div("OperatingSystem"),
$q->div(
$q->radio_group(
-name=>'ostype',
-values=>['Windows','Linux']
)
),
$q->end_form,
$q->end_html
);
这是 perl 脚本创建的 html(间距由我调整):
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Input Request</title>
<link rel="stylesheet" type="text/css" href="../css/my.css" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<div id="divtop"><p>Here's a paragraph</p></div>
<form method="post" action="/cgi-bin/perl2.pl" enctype="multipart/form-data">
<div>OperatingSystem</div>
<div>
<label><input type="radio" name="ostype" value="Windows" checked="checked" />Windows</label>
<label><input type="radio" name="ostype" value="Linux" />Linux</label>
</div>
<div><input type="hidden" name=".cgifields" value="ostype" /></div>
</form>
</body>
</html>
请注意,您可以免费获得 head 标签。我认为这是因为标题和链接标签应该在格式良好的 html 中的 head 标签内。
而且,这里使用的是Link()
:
print(
$q->header,
$q->start_html(
-title => 'Input Request',
-head => Link({
-rel => 'stylesheet',
-type => 'text/css',
-href => '../css/my.css'
})
),
$q->div(
{-id=>"divtop"},
$q->p("Here's a paragraph")
),
$q->start_form(
-method=>'post'
),
$q->div("OperatingSystem"),
$q->div(
$q->radio_group(
-name=>'ostype',
-values=>['Windows','Linux']
)
),
$q->end_form(),
$q->br(),
$q->end_html()
);
如果我添加media => 'print
到Link()
将属性添加到链接标记的哈希中media="print"
,则 css 在我的浏览器中被禁用。另一方面,当我在浏览器中对页面进行打印预览时,我确实看到了 css 样式。我认为这是预期的行为。这是html:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Input Request</title>
<link type="text/css" rel="stylesheet" href="../css/my.css" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<div id="divtop"><p>Here's a paragraph</p></div><form method="post" action="/cgi-bin/perl2.pl" enctype="multipart/form-data"><div>OperatingSystem</div><div><label><input type="radio" name="ostype" value="Windows" checked="checked" />Windows</label> <label><input type="radio" name="ostype" value="Linux" />Linux</label></div><div><input type="hidden" name=".cgifields" value="ostype" /></div></form><br />
</body>
</html>