【问题标题】:Calling one Perl script from another, passing a CGI parameter从另一个调用一个 Perl 脚本,传递一个 CGI 参数
【发布时间】:2018-06-14 12:07:45
【问题描述】:

我有两个 Perl 脚本。我们称他们为one.pltwo.pl

one.pl处理一些数据,需要调用two.pl,传递一个变量。

one.pl我可以

require "two.pl"

调用第二个脚本。

这很好,但我想将 CGI 变量传递给 two.pl

有没有办法在不将two.pl 重写为 Perl 模块的情况下做到这一点?

例如我想要的是:

一个.pl

...

require "two.pl $number";

两个.pl

use CGI;

my $cgi = new CGI;

my $number = $cgi->param('number');

...

编辑: two.pl 应该只被调用一次

【问题讨论】:

  • $number 已经是 CGI 参数,还是其他值?
  • @mob 你的答案几乎是正确的。
  • 对于初学者,不要将require 用于.pl 文件。你应该使用do
  • “有没有什么办法可以在不将第二个脚本重写为模块的情况下做到这一点?” 重写几乎可以肯定是正确的选择,但很大程度上取决于@ 987654335@ 确实如此。 require 解决方案有一个陷阱,这是错误的选择。坚持它可能符合你的目的,但你是在谴责其他人处理难以发现的错误。
  • 我认为我们需要查看one.pltwo.pl 包含的内容,以便我们更好地了解您要做什么。如果你能把它减少到我们可以自己运行的几行代码,那就太好了!

标签: perl cgi require


【解决方案1】:

如果 one.pl 不在 CGI 环境中

如果你的one.pl是一个shell脚本,你可以在调用require之前设置@ARGV。这滥用了CGI 的模式来处理命令行参数。 arg 需要是参数名称等于值。

{
    my $number = 5;
    local @ARGV = ( "number=$number" );
    require "two.pl";
}

key=value 格式很重要。 local keyword 确保 @ARGV 仅设置在块内,确保脚本的其他可能参数不会永久丢失,而是对 two.pl 不可见。

如果 one.pl 在 CGI 环境中

  • 如果参数已经存在,则无需执行任何操作。
  • 其他,见上文。

请注意,对于这两种情况,您只能require 一个脚本一次。这就是require 的想法。 Perl 会跟踪它已经加载的内容(在%INC 中)。如果您处于mod_perl 之类的环境中,或者是持久运行的现代 Perl 应用程序,您应该改用do "two.pl",它每次都会执行它。但是,如果 two.pl 并非设计为在同一进程中多次运行,那么这可能会破坏其他事情。

最好的办法是将 two.pl 中的代码重构为一个模块,并在两个脚本中使用它。

【讨论】:

  • 谢谢@simbabque。我通过编辑 one.pl 使其也可以使用 CGI。
  • @simbabque:令人尴尬的是,我并没有意识到这需要一个 shell,但我的 “或等效的” 意味着包含 system 'two.pl', "number=$number",它应该在perl.我还质疑require 的使用,它不恰当地搜索@INC 并添加到%INC,但最重要的是,如果有匹配的%INC 条目,将不会再次执行该文件。 require 仅用于加载定义,不适用于可执行代码。你需要do(或system或反引号),我不得不给你投反对票。
  • @simbabque:我还要说 “因为我们没有在新的 shell 中执行它” 是一个没有根据的假设:这是您选择的解决方案。 OP 说 “我想将 CGI 变量传递给第二个脚本”,所以听起来只需要传达 一个 环境变量。除了为 two.pl 所做的任何事情启动一个新进程的明显开销之外,当然没有理由留在当前进程中。
  • @simbabque:我还认为,鉴于 OP 的专业知识,您应该谨慎定义 “在 CGI 环境中” 的含义。任何了解流程环境的人都已经有了答案。
  • 很公平@borodin。更好?
猜你喜欢
  • 2012-03-10
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多