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
如何从DCL脚本调用Perl函数?_Perl_Vms_Dcl - Fatal编程技术网

如何从DCL脚本调用Perl函数?

如何从DCL脚本调用Perl函数?,perl,vms,dcl,Perl,Vms,Dcl,我有一个DCL脚本,需要调用Perl脚本中的Perl函数。如何做到这一点并在DCL脚本中捕获该Perl函数的输出 我知道我可以如下调用Perl脚本: $ perl my_perl_script.pl 但是我想在Perl模块中调用一个特定的函数,并能够在我的DCL脚本中使用该函数的返回值。如果它是一个模块,并且如果您可以使用system()函数(或类似的函数)访问shell,那么您就可以这样做 perl -MMy::Module -e 'My::Module->new->method

我有一个DCL脚本,需要调用Perl脚本中的Perl函数。如何做到这一点并在DCL脚本中捕获该Perl函数的输出

我知道我可以如下调用Perl脚本:

$ perl my_perl_script.pl

但是我想在Perl模块中调用一个特定的函数,并能够在我的DCL脚本中使用该函数的返回值。

如果它是一个模块,并且如果您可以使用
system()
函数(或类似的函数)访问shell,那么您就可以这样做

perl -MMy::Module -e 'My::Module->new->method;';echo $?
其中,
My::Module
是模块的名称,
method
是要调用的方法的名称。
echo$?
命令(假设您在Linux/Unix系统上)将告诉您shell接收到的方法调用的返回值


这是一个具体的答案,因为你不需要发布你的代码就可以得到它。

我可以想到一些可能性(以前从未真正做过)

编写一个Perl脚本来调用函数并将结果输出到STDOUT。然后在DCL脚本中,您可以将该输出捕获到一个文件中,并将其读回以使用它。或者,也可以通过管道捕获输出并对其进行处理。我想,这取决于输出是什么以及你想用它做什么

或者,似乎有一些用于Perl的OpenVMS模块,允许您获取和设置符号。如果您可以找到其中一个,那么您的Perl脚本可以在DCL命令文件中从该点开始设置要使用的符号

我倾向于后一种选择


我不相信有一种方法可以直接从DCL调用Perl函数,就像没有一种方法可以从DCL级别的任何其他语言调用函数一样。

多年来,VMS::DCLsym模块一直是Perl核心发行版的一部分,它使存储函数(或任何其他)的返回值变得容易在DCL符号中。下面是一个例子:

$ perl -"MVMS::DCLsym" -e "$x = sprintf('0x%x', 99); VMS::DCLsym->setsym('X', $x, 'GLOBAL');"
$ show symbol x
  X == "0x63"
另外,默认情况下,%ENV散列映射到主管模式进程逻辑名称,这意味着它们在Perl退出后仍然存在。因此,当Perl退出时,还有另一种方法可以为CLI留下一些东西:

$ perl -e "$ENV{'X'} = sprintf('0x%x', 99);"
$ show logical x
  "X" = "0x63" (LNM$PROCESS_TABLE)
$ x = f$trnlnm("X")
$ show symbol x
  X = "0x63"
如果您只想传递回DCL的是一个整数值,那么您可以使用该值退出Perl并从DCL中始终可用的$STATUS符号中检索它:

$ perl -e "exit 99;"
$ show symbol $status
  $STATUS == "%X00000063"
但是这里有一些复杂的情况,因为CLI会将该值解释为成功(奇数值)或失败(偶数值),在后一种情况下,调用您设置的任何相关警告或错误处理程序,并尝试检索消息文本(如果有)。换句话说,退出状态对DCL来说实际上意味着什么,比如在这个著名的复活节彩蛋中:

$ perl -e "exit 2928;"
%SYSTEM-W-FISH, my hovercraft is full of eels
您可以使用“vmish'hushed'”pragma禁止打印消息,并且在打印时,您还需要使用“vmish'exit'”pragma来防止将0映射到一般成功值,将1映射到一般失败值,前提是这些值在您可能返回的数字范围内。这看起来像是:

$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
  $STATUS == "%X10000B70"
请注意,对于偶数的退出值,仍然可以调用处理程序。

刚刚注意到这一点,在我的第一个备选方案中有一个很好的例子说明了如何执行此操作。