更改查询参数并传递给eval执行的其他.cgi文件在perl中执行

时间:2014-12-03 12:08:29

标签: perl cgi eval

我正在处理perl CGI文件,该文件在eval do {}的帮助下调用另一个.CGI文件 现在我尝试更改查询参数并在下面的代码的帮助下将一个参数追加到查询参数列表中:

file1.cgi use CGI;
    my $q = CGI->new();
    $q->param(-value=>'new value', -name=>'field1'); #appending query param

    my $field1 = $query->param('field1');
    print "===> $field1 <==="; #prints the value of field1

    open MACROFILE,"<file2.cgi" or print "Could not open file";
    my $mstatus = eval do{local $/;<MACROFILE>} or print $@; ## passing content of file to eval
    close MACROFILE;

下面是file2.cgi中的代码,它在eval中执行:

file2.cgi:
    use CGI;
    my $query = new CGI;
    my $field1 = $query->param('field1');
    print "===> $field1 <==="; #Empty value since "field1" in not found in query params

为什么附加查询参数没有被缓存,还有其他方法可以做同样的事情吗?

1 个答案:

答案 0 :(得分:1)

由于file2.cgi是一个CGI程序,它希望被称为CGI程序 - 即使用HTTP请求。当然,你不能只是eval该文件并期望它能够正常工作。

为什么file2.cgi需要成为CGI程序?它是否存在于另一台服务器或类似的东西上?如果是这种情况,那么你应该这样做:

use LWP::Simple;

my $response = get("http://your-server.com/file2.cgi?field1=new+value");

但如果你只是在同一台服务器上调用一个程序,你可以使用system()来调用它。

# Renamed the file as it's no longer a CGI program
system('/path/to/file2.pl', 'new value');

在这种情况下,您需要重写file2,以便从命令中读取其参数,如。

my $field1 = @ARGV[0];

但也许我完全是误会,你有充分的理由采取你在这里尝试的巴洛克方式。