我有一个DCL脚本,需要调用位于Perl脚本中的Perl函数。如何在DCL脚本中捕获Perl函数的输出?
我知道我可能可以按如下方式调用Perl脚本:
$ perl my_perl_script.pl但是我希望在Perl模块中调用一个特定的函数,并且能够在我的DCL脚本中使用该函数的返回值。
发布于 2012-04-22 19:31:02
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您可以使用"vmsish 'hushed'“杂注来抑制消息的打印,当您正在打印消息时,您还需要使用"vmsish 'exit'”杂注来阻止将0映射到一般成功值,将1映射到泛型失败值,前提是这些值在您可能返回的数字范围内。这样看起来就像:
$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
$STATUS == "%X10000B70"注意,对于偶数的退出值,仍然可以调用处理程序。
发布于 2012-03-15 20:11:15
如果它是一个模块,如果您可以使用一个system()函数(或类似的函数)访问shell,那么您就可以这样做。
perl -MMy::Module -e 'My::Module->new->method;';echo $?其中,My::Module是模块的名称,method是要调用的方法的名称。echo $?命令(假设您在Linux/Unix系统上)将告诉您由shell接收的方法调用的返回值。
这是一个非常具体的答案,因为你不用发布你的代码就能得到它。
发布于 2012-03-19 01:29:53
有几种可能性,我可以想象(从来没有真正做过)。
编写一个Perl脚本来调用函数并将结果输出到STDOUT。然后,在DCL脚本中,您可以将输出捕获到一个文件中,并将其读取回使用它。或者,也许,通过管道捕获输出并处理它。我想,这取决于输出是什么,以及你想用它做什么。
或者,在Perl中似乎有一些OpenVMS模块,允许您获取和设置符号。如果您可以找到其中一个,那么您的Perl脚本可以在DCL命令文件中设置一个从那一点开始使用的符号。
我倾向于赞成后一种选择。
我不相信有一种方法可以直接从DCL调用Perl函数,就像在DCL级别调用来自任何其他语言的函数一样。
https://stackoverflow.com/questions/9727162
复制相似问题