gpt4 book ai didi

windows - 从另一个具有不同 Active perl 版本的 perl 脚本调用 perl 函数

转载 作者:行者123 更新时间:2023-12-03 23:29:06 25 4
gpt4 key购买 nike

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

后续步骤:
在 5.6 版本中执行的调用者代码使用 system/require 命令调用 5.24 版本。

问题:
如何通过系统命令、require 等从 5.6 perl 脚本调用 5.24 perl 函数(例如:webservicecall(arg1){return "xyz")?
还有如何获得 perl 函数 5.24 的返回值?

注:
拥有两个 perl 版本是一项临时工作,我们计划将其升级为更高版本。

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

"**p5_6.pl**"

print "Hello Perl5_6\n";
system('D:\Perl\bin\perl D:\sample_program\p5.24.pl');

print $OUTFILE;
$retval = Mul(25, 10);
print ("Return value is $retval\n" );

"**p5_24.pl**"

print "Hello Perl5_24\n";
our $OUTFILE = "Hello test";
sub Mul($$)
{
my($a, $b ) = @_;
my $c = $a * $b;
return($c);
}

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

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

最佳答案

将需要 v5.24 的函数的代码放在包装脚本中,编写它只是为了运行该函数(并打印其结果)。实际上,我建议使用该函数编写一个模块,然后将该模块加载到包装脚本中。
然后在想要的 (5.24) 解释器下运行该脚本,通过其完整路径调用它。 (您可能需要小心确保所有库和环境都是正确的。)以允许您获取其输出的方式执行此操作。这可以是任何东西,从反引号( qx )到管道打开,或者更好的是,到好的模块。为此有一系列模块,例如 IPC::System::Simple , Capture::Tiny , IPC::Run3 , 或 IPC::Run .使用哪个取决于您需要多少通话。
您不能在正在运行的程序中调用函数,而是让它以某种方式在另一个程序下运行。
此外,在一个程序中定义的变量(如 $OUTFILE )无法在另一个程序中看到。您可以从 v5.24 程序中打印它们以及该函数结果,然后在 v5.6 程序中解析整个输出。然后这两个程序需要一些“协议(protocol)”——要么遵守打印的顺序,要么以某种方式标记打印。
更好的是,编写一个包含需要共享的函数和变量的模块。然后 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 程序(在下面用作 program_for_5.24.pl )可以做
use warnings;
use strict;

# Require this to be run by at least v5.24.0
use v5.24;

# Add path to where the module is, relative to where this script is
# In our demo it's the script's directory ($RealBin)
use FindBin qw($RealBin);
use lib $RealBin;

use SharedBetweenPerls qw(Mul);

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

print Mul($v1, $v2);
而 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_filename$from_5.24变量是 250 .†
如果两个程序和模块都在同一个目录中,并且名称与本示例中相同,则测试它可以按原样工作。 (并将 path-to-perl-5.24 替换为 v5.24 可执行文件的实际路径。)如果它们位于不同的位置,您需要调整路径,可能是包名和 use lib线。见 lib pragma .
请注意,有更好的方法来运行外部程序 --- 请参阅上面推荐的模块。所有这些都是一个粗略的演示,因为许多细节取决于你具体做什么。
最后,程序还可以通过套接字连接并交换它们需要的所有内容,但这有点复杂,可能不需要。

† 问题已被编辑,我们现在有 D:\Perl\bin\perl对于 path-to-perl-5.24D:\sample_program\p5.24.pl对于 program_for_5.24 .
请注意,使用 p5.24.pl 这样的位置程序您必须为模块提出一个合适的位置,然后它的名称需要在其中包含(一部分)该路径并使用该名称加载。参见示例 this post .

没有模块的粗略演示(最初发布)
作为一个非常粗略的草图,在您在 v5.6 下运行的程序中,您可以执行
my $from_5.24 = qx(path-to-perl-5.24 program_for_5.24.pl 25 10);
program_for_5.24.pl那么可能是这样的
use warnings;
use strict;

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

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

print Mul($v1, $v2);
和变量 $from_5.24最终成为 250在我的测试中。

关于windows - 从另一个具有不同 Active perl 版本的 perl 脚本调用 perl 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61053765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com