Windows 从另一个具有不同活动perl版本的perl脚本调用perl函数
我们有两个版本的活动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”值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版本运行的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
forpath-to-Perl-5.24
和D:\sample\u program\p5.24.pl
forprogram\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程序),以便获得它的输出(whatsystem)<
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);