从其他 cgi 脚本调用 cgi 脚本
calling cgi script from other cgi script
我在使用 perl cgi 时发现了一个令人费解的行为——我想——对此有一个完全有效的解释,但我找不到。
在 Whosebug 上有 this 个问题,但它描述的内容对我来说似乎失败了。
情况:
我有两个 perl cgi 脚本。其中之一(比方说 script.pl
)可以独立生成一个网站,但也有一个参数,我们称它为 BARE
,这样它就会简单地吐出非格式化信息。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
unless ( defined $cgi->param('BARE') ) {
print $cgi->header, $cgi->start_html,$cgi->h1('Hello World'), $cgi->end_html;
} else {
print "Bare";
}
现在我正尝试从另一个脚本(我们称之为 call_my_script.pl
)调用此脚本,并将其 'BARE' 参数设置为本地脚本(因为它们位于同一目录中)。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
my $result = qx(./script.pl "BARE=1");
print $cgi->header,$cgi->start_html,$result,$cgi->end_html;
当运行这个脚本来自命令行时,我得到:
> ./call_my_script.pl
Content-Type: text/html; charset=ISO-8859-1
<!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>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
Bare
</body>
</html>
当我通过浏览器调用同一个脚本时 returns
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>Untitled Document</title>
</head><body>Content-Type: text/html; charset=ISO-8859-1
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>Untitled Document</title>
</head><body><h1>Hello World</h1></body></html></body></html>
因此,尽管我使用 qx
在本地调用第一个脚本,并且传递参数以获取裸格式,但在通过浏览器调用时并没有得到尊重。
我可能忽略了一些明显的东西,但如果能理解它是什么,我将不胜感激。
CGI 程序通常期望从环境变量 QUERY_STRING
中获取参数值。在命令行上传递参数值是一种调试工具,仅当程序在命令提示符
中 运行 时才有效
你可以试试这样的
my $result = do {
local $ENV{QUERY_STRING} = 'BARE=1';
qx{./script.pl};
};
我在使用 perl cgi 时发现了一个令人费解的行为——我想——对此有一个完全有效的解释,但我找不到。
在 Whosebug 上有 this 个问题,但它描述的内容对我来说似乎失败了。
情况:
我有两个 perl cgi 脚本。其中之一(比方说 script.pl
)可以独立生成一个网站,但也有一个参数,我们称它为 BARE
,这样它就会简单地吐出非格式化信息。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
unless ( defined $cgi->param('BARE') ) {
print $cgi->header, $cgi->start_html,$cgi->h1('Hello World'), $cgi->end_html;
} else {
print "Bare";
}
现在我正尝试从另一个脚本(我们称之为 call_my_script.pl
)调用此脚本,并将其 'BARE' 参数设置为本地脚本(因为它们位于同一目录中)。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
my $result = qx(./script.pl "BARE=1");
print $cgi->header,$cgi->start_html,$result,$cgi->end_html;
当运行这个脚本来自命令行时,我得到:
> ./call_my_script.pl
Content-Type: text/html; charset=ISO-8859-1
<!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>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
Bare
</body>
</html>
当我通过浏览器调用同一个脚本时 returns
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>Untitled Document</title>
</head><body>Content-Type: text/html; charset=ISO-8859-1
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>Untitled Document</title>
</head><body><h1>Hello World</h1></body></html></body></html>
因此,尽管我使用 qx
在本地调用第一个脚本,并且传递参数以获取裸格式,但在通过浏览器调用时并没有得到尊重。
我可能忽略了一些明显的东西,但如果能理解它是什么,我将不胜感激。
CGI 程序通常期望从环境变量 QUERY_STRING
中获取参数值。在命令行上传递参数值是一种调试工具,仅当程序在命令提示符
你可以试试这样的
my $result = do {
local $ENV{QUERY_STRING} = 'BARE=1';
qx{./script.pl};
};