从第二个perl文件调用一个perl文件,同时获取第二个文件的变量

从第二个perl文件调用一个perl文件,同时获取第二个文件的变量,perl,Perl,我想知道这是否可行。文件a.pm包含b.pl所需的几个变量。b.pl由a.pm调用 a.pm { $var1,$var2; system (perl b.pl); } b.pl { print "$var1"; } 如何将$var1和$var2用于b.pl。我不想将命令行参数作为命令行参数传递给b.pl如果对新的Perl解释器进行系统调用,则不能共享相同的变量。为此,可以将它们作为命令行参数传递 use strict; use warnings; my

我想知道这是否可行。文件a.pm包含b.pl所需的几个变量。b.pl由a.pm调用

 a.pm
    {
    $var1,$var2;
    system (perl b.pl);
    }

b.pl 
{
print "$var1";
}

如何将$var1和$var2用于b.pl。我不想将命令行参数作为命令行参数传递给b.pl

如果对新的Perl解释器进行系统调用,则不能共享相同的变量。为此,可以将它们作为命令行参数传递

use strict;
use warnings;

my $var1 = 'foo';
my $var2 = 'bar';

system( 'perl b.pl', $var1, $var2);
然后在b.pl中:

use strict;
use warnings;

print $ARGV[0];
参数以中结束,可以用作常规数组。如果要共享数据结构,必须首先序列化它们。你可以用或来做那件事。然后需要在第二个程序中反序列化它们


还有更复杂的替代方案,但我想详细介绍一下(比如保存到文件、打开管道以及在第二个脚本中读取STDOUT)有点超出范围。

您可以使用系统将
$var1
var2
a.pm传递到b.pl,同时执行命令。请检查以下各项:

a.pm

my ($var1,$var2);
$var1="Open";
$var2="Close";
system ("perl b.pl $var1 $var2");
my ($var1,$var2);
$var1="Open";
$var2="Close";
$ENV{m_temp_x_var1}=$var1;
$ENV{m_temp_x_var2}=$var2;
system ("perl b.pl");
b.pl

my $var1=$ARGV[0];
my $var2=$ARGV[1];
print "$var1";
my $var1=$ENV{m_temp_x_var1};
my $var2=$ENV{m_temp_x_var2};
print "$var1";
输出将是:

打开

如果不需要通过命令行发送值,请尝试以下操作。 方法是通过在%ENV散列中设置值来传递值,如下程序所示。为其设置密钥时请小心,以免它替换现有的%ENV密钥

a.pm

my ($var1,$var2);
$var1="Open";
$var2="Close";
system ("perl b.pl $var1 $var2");
my ($var1,$var2);
$var1="Open";
$var2="Close";
$ENV{m_temp_x_var1}=$var1;
$ENV{m_temp_x_var2}=$var2;
system ("perl b.pl");
b.pl

my $var1=$ARGV[0];
my $var2=$ARGV[1];
print "$var1";
my $var1=$ENV{m_temp_x_var1};
my $var2=$ENV{m_temp_x_var2};
print "$var1";
输出将是:


打开

请回答您的问题,并使代码有效,这样它至少可以编译。a.pm的代码有语法错误。此外,a是模块,b是脚本是否相关?您是否使用了
严格
警告
?您应该总是在新代码中这样做(尽管它与这个问题无关)。那么OOP方法呢?创建两个模块
a.pm
b.pm
。在每个模块中都有一个对象,为模块1创建对象后,为模块2创建对象,并将模块1的参数发送给他(1)。请提供合理的脚本。这甚至不是草图。(2) 至于您的编辑,您所说的“不想作为命令行参数传递”是什么意思?
a.pm
、使用它的代码和
b.pl
有什么关系?我敢打赌这是一个。输出将是$var1。您需要使用双引号
系统
调用中获取插值,或者将变量作为附加参数传递给
系统
,也可以免费获得正确的shell转义。@simbabque抱歉,我忘了。