Perl 如何将变量从一个CGI脚本传递到另一个CGI脚本?

Perl 如何将变量从一个CGI脚本传递到另一个CGI脚本?,perl,cgi,Perl,Cgi,我有一个CGI perl脚本,名为install-app-pl.CGI: #!/usr/bin/perl -w print header('text/html'); use strict; use CGI ':standard'; # Get me some vars my @params = param(); my $APP_NAME = param('app_name'); my $APP_WEB_PORT = param('app_web_port')

我有一个CGI perl脚本,名为
install-app-pl.CGI

#!/usr/bin/perl -w

print header('text/html');

use strict;
use CGI ':standard';

# Get me some vars

my @params = param();

my $APP_NAME          = param('app_name');
my $APP_WEB_PORT      = param('app_web_port');
my $APP_WEB_USER      = param('app_web_user');
my $APP_WEB_PASS      = param('app_web_pass');
my $DOWNLOAD_DIR      = param('download_dir');
my $CONFIG_DIR        = param('config_dir');
my $LIBRARY_DIR       = param('library_dir');
my $TEMP_DOWNLOAD_DIR = param('temp_download_dir');

# Run another script

if ( $APP_NAME ) {
    print "Installing $APP_NAME...";
    print "<pre>";
    system ("perl /var/www/mysite.local/public_html/lib/$APP_NAME/install-$APP_NAME.pl");
    print "</pre>" ;
}
else {
    print "No app specified, check the error log";
}

但我不确定传递这些信息的最佳方式。

你确定install-app-pl.cgi是一个cgi程序吗?您确定它不仅仅是一个Perl命令行程序吗?我的意思是,我知道它是如何命名的,但是像这样使用
system()
调用CGI程序似乎很奇怪

这里的区别至关重要。CGI程序以与命令行程序不同的方式访问其参数

如果它确实是一个CGI程序,那么您有几个选项:

  • 向它发出HTTP请求(使用来自的内容)
  • 使用CGI.pm的调试机制以与当前调用相同的方式调用它,但传递CGI参数,如
    foo=xxx&bar=yyy&baz=zzz
    (有关详细信息,请参阅)。当然,这依赖于使用CGI.pm的程序,我觉得有点不对劲
  • 如果您使用
    system()
    从另一个程序调用,请扪心自问,该程序是否真的需要是CGI程序。然后决定将其重写为命令行程序。如果同时需要CGI版本和命令行版本,那么可以将大部分代码移动到一个模块中,该模块可由两个只提取参数的精简包装器使用
关于代码的其他几点

  • Perl5.6(2000年发布)引入了
    use warnings
    pragma。现在大多数人用它来代替shebang行中的
    -w
  • 在加载定义函数的CGI模块之前调用
    header()
    函数似乎有些奇怪。这是可行的,因为
    使用
    是在编译时处理的,但最好对代码重新排序,使其更有意义
  • 同样地。大多数人都会将严格使用(以及使用警告)作为他们程序中的第一件事。就在射邦线之后
  • system()
    返回进程的返回值。如果您的第二个程序生成了希望显示在网页上的有用输出,则应改用反勾号
  • 如果所有输出都将在
    元素中,为什么不删除该元素并返回“text/plain”内容类型呢

更新:如果我没有重申很多人在评论你的原始问题时已经说过的话,那我就是失职了-这听起来是个糟糕的主意。

你确定install-app-pl.cgi是一个cgi程序吗?您确定它不仅仅是一个Perl命令行程序吗?我的意思是,我知道它是如何命名的,但是像这样使用
system()
调用CGI程序似乎很奇怪

这里的区别至关重要。CGI程序以与命令行程序不同的方式访问其参数

如果它确实是一个CGI程序,那么您有几个选项:

  • 向它发出HTTP请求(使用来自的内容)
  • 使用CGI.pm的调试机制以与当前调用相同的方式调用它,但传递CGI参数,如
    foo=xxx&bar=yyy&baz=zzz
    (有关详细信息,请参阅)。当然,这依赖于使用CGI.pm的程序,我觉得有点不对劲
  • 如果您使用
    system()
    从另一个程序调用,请扪心自问,该程序是否真的需要是CGI程序。然后决定将其重写为命令行程序。如果同时需要CGI版本和命令行版本,那么可以将大部分代码移动到一个模块中,该模块可由两个只提取参数的精简包装器使用
关于代码的其他几点

  • Perl5.6(2000年发布)引入了
    use warnings
    pragma。现在大多数人用它来代替shebang行中的
    -w
  • 在加载定义函数的CGI模块之前调用
    header()
    函数似乎有些奇怪。这是可行的,因为
    使用
    是在编译时处理的,但最好对代码重新排序,使其更有意义
  • 同样地。大多数人都会将严格使用(以及使用警告)作为他们程序中的第一件事。就在射邦线之后
  • system()
    返回进程的返回值。如果您的第二个程序生成了希望显示在网页上的有用输出,则应改用反勾号
  • 如果所有输出都将在
    元素中,为什么不删除该元素并返回“text/plain”内容类型呢

更新:如果我没有重申很多人在评论你的原始问题时已经说过的话,那我就是失职了——这听起来是个糟糕的主意。

那么你要根据用户输入在文件系统上执行东西,而不彻底清理/限制数据?隐马尔可夫模型。。。有趣的方法。将参数传递给脚本的方式与将参数传递给任何shell进程的方式相同。如果你有一堆,传递一个序列化表示(例如JSON)或使用某种持久性存储(例如文件、数据库)可能更有意义。@stevieb:我不同意。你真的学会了如何一下子把每件事都做好吗?如果是这样的话,那么你知道的比我多得多。至于我们对这类问题的反应:我们这里的大多数人都是专业的程序员,已经使用Perl很长时间了。如果有人问了一个非常具体的问题,我们通常不会质疑原因,但在你的案例中,有很多背景故事听起来像是一个糟糕的方法。因此,我们建议替代方案并指出缺陷。这意味着鼓励你学习更多,以更安全或更现代的方式做事。你也会要求最好的方式,这会引起人们的意见,这是离题的。这里已经提到了三种可以回答这个问题的方法,我知道至少还有两种。
#!/usr/bin/perl -w

print header('text/html');

use strict;
use CGI ':standard';

require "/var/www/mysite.local/public_html/cgi-bin/install-app-pl.cgi"

# Echo my vars

print "$CONFIG_DIR $DOWNLOAD_DIR $LIBRARY_DIR $PGID $PUID $TZ $APP_WEB_PORT";