Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从另一个具有不同活动perl版本的perl脚本调用perl函数_Windows_Perl_Object_Version_Activeperl - Fatal编程技术网

Windows 从另一个具有不同活动perl版本的perl脚本调用perl函数

Windows 从另一个具有不同活动perl版本的perl脚本调用perl函数,windows,perl,object,version,activeperl,Windows,Perl,Object,Version,Activeperl,我们有两个版本的活动perl 5.6和5.24。我们有web服务,它必须在活动perl“5.24”版本(采用TLS 1.2版本)上执行,这需要从活动perl“5.6”版本调用。我们使用的是windows操作系统 接下来的步骤: 在5.6版本中执行的调用方代码使用system/require命令调用5.24版本 问题: 如何通过系统命令、require等从5.6Perl脚本调用5.24Perl函数(例如:webservicecall(arg1){return“xyz”)。。? 另外,如何获取per

我们有两个版本的活动perl 5.6和5.24。我们有web服务,它必须在活动perl“5.24”版本(采用TLS 1.2版本)上执行,这需要从活动perl“5.6”版本调用。我们使用的是windows操作系统

接下来的步骤: 在5.6版本中执行的调用方代码使用system/require命令调用5.24版本

问题: 如何通过系统命令、require等从5.6Perl脚本调用5.24Perl函数(例如:webservicecall(arg1){return“xyz”)。。? 另外,如何获取perl函数5.24的返回值

注意: 有两个perl版本只是暂时的,我们计划升级到更高版本

这里,perl版本5.6安装在“C:\perl\bin\perl\”中,perl版本5.24安装在“D:\perl\bin\perl\”中

为了获取详细信息,我编写了示例程序,从perl脚本5.6版本调用perl 5.24版本。在执行过程中,我没有得到预期的输出。如何在p5_6.pl脚本中获得p5_24.pl的“return$c”值和“our$OUTFILE”值


注意:以上是基于此的示例程序,我将使用序列化数据修改实际程序。

您不能直接调用使用其他Perl版本运行的Perl函数。您需要创建一个显式调用该函数的程序。需要显式序列化输入和输出,以便在这两个程序之间传输


序列化可以使用
数据::转储程序
可存储
或类似程序完成。如果需要较低的性能,您可以调用为函数提供
系统
的程序,并使用临时文件或管道共享序列化数据。或者您可以创建一些客户端-服务器体系结构并共享序列化数据带套接字的ta。后者速度更快,因为它跳过了另一个进程的重复启动和拆卸,而是让它保持运行。

将需要v5.24的函数的代码放在包装器脚本中,编写该脚本是为了让它运行该函数(并打印其结果).实际上,我建议使用该函数编写一个模块,然后将该模块加载到包装器脚本中

然后在想要的(5.24)解释器下运行该脚本,方法是通过其完整路径调用它。(您可能需要小心确保所有库和环境都正确。)以允许您获取其输出的方式执行此操作。这可以是任何回勾(
qx
)通过管道打开或更好地连接到好的模块。有一系列的模块用于此,如
Capture::Tiny
IPC::System::Simple
IPC::Run3
,或
IPC::Run
。使用哪种模块取决于您需要从该调用中获得多少

你不能在一个正在运行的程序中调用函数,而是让它在另一个程序下运行

此外,在一个程序中定义的变量(如
$OUTFILE
)在另一个程序中看不到。您可以从v5.24程序中打印它们以及该函数结果,然后在v5.6程序中解析整个输出。然后这两个程序将需要一点“协议”--要么遵守印刷品的顺序,要么以某种方式给印刷品贴上标签

更好的方法是,编写一个包含需要共享的函数和变量的模块。然后,v5.24程序可以加载该模块并导入它所需的函数并运行它,而v5.6程序可以加载相同的模块,但只能拾取该变量(同时运行v5.24程序)

下面是所有这些的草图。包文件
SharedBetweenPerls.pm

package SharedBetweenPerls;

use warnings; 
use strict;

use Exporter qw(import);
our @EXPORT_OK = qw(Mul export_vars);

my $OUTFILE = 'test_filename';

sub Mul { return $_[0] * $_[1] }

sub export_vars { return $OUTFILE }

1;
然后v5.24程序(在下面用作5.24.pl的
程序)就可以了

而v5.6程序可以

use warnings;
use strict;
use feature 'say';

use FindBin qw($RealBin);
use lib $RealBin;

use SharedBetweenPerls qw(export_vars);

my $outfile = export_vars();  #--> 'test_filename'

# Replace "path-to-perl..."  with an actual path to a perl
my $from_5.24 = qx(path-to-perl-5.24 program_for_5.24.pl 25 10);  #--> 250

say "Got variable: $outfile, and return from function: $from_5.24";
其中
$outfile
具有字符串
test\u filename
,而
$from\u 5.24
变量为
250

如果两个程序和模块都在同一个目录中,并且名称与本例中相同,则测试结果可以正常工作。(并且将
path-to-perl-5.24
替换为v5.24可执行文件的实际路径,无论它在何处。)如果它们位于不同的位置,则需要调整路径,可能是包名和
use lib
行。请参阅

请注意,有更好的方式运行外部程序——请参阅上面推荐的模块。我要强调的是,这是一个粗糙的演示,因为许多细节取决于您具体做什么

最后,这些程序还可以通过套接字连接并交换它们所需的一切,但这有点复杂,可能不需要


†问题已经编辑,我们现在有
D:\Perl\bin\Perl
for
path-to-Perl-5.24
D:\sample\u program\p5.24.pl
for
program\u for\u 5.24

请注意,对于
p5.24.pl
程序的这样一个位置,您必须为模块找到一个合适的位置,然后它的名称需要包含(部分)该路径,并使用这样的名称加载。请参阅示例


没有模块的原始演示(最初发布)

作为一个非常粗略的草图,在v5.6下运行的程序中,您可以

my $from_5.24 = qx(path-to-perl-5.24 program_for_5.24.pl 25 10);
如果_5.24.pl的
程序_
可能是

use warnings;
use strict;

sub Mul { return $_[0] * $_[1] }

my ($v1, $v2) = @ARGV;

print Mul($v1, $v2);

在我的测试中,变量
$from_5.24
最终为
250

我已详细分享了我的查询我已在中分享了我的查询detail@Grace示例
p5.24.pl
程序需要运行它定义的函数(
Mul
),并打印它要发送给调用它的人的内容。因此,您需要在它中
print Mul(25,10);
。然后调用
p5.24.pl
程序(来自v5.6程序),以便获得它的输出(what
system)<
my $from_5.24 = qx(path-to-perl-5.24 program_for_5.24.pl 25 10);
use warnings;
use strict;

sub Mul { return $_[0] * $_[1] }

my ($v1, $v2) = @ARGV;

print Mul($v1, $v2);