首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DCL脚本调用Perl函数?

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

Stack Overflow用户
提问于 2012-03-15 19:53:59
回答 3查看 674关注 0票数 0

我有一个DCL脚本,需要调用位于Perl脚本中的Perl函数。如何在DCL脚本中捕获Perl函数的输出?

我知道我可能可以按如下方式调用Perl脚本:

代码语言:javascript
复制
$ perl my_perl_script.pl

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

EN

回答 3

Stack Overflow用户

发布于 2012-04-22 19:31:02

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

代码语言:javascript
复制
$ perl -"MVMS::DCLsym" -e "$x = sprintf('0x%x', 99); VMS::DCLsym->setsym('X', $x, 'GLOBAL');"
$ show symbol x
  X == "0x63"

此外,默认情况下,%ENV哈希被映射到监控程序模式的进程逻辑名称,这意味着它们在Perl退出后仍然存在。因此,当Perl退出时,另一种为CLI留下一些东西的方法是:

代码语言:javascript
复制
$ 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符号中检索它:

代码语言:javascript
复制
$ perl -e "exit 99;"
$ show symbol $status
  $STATUS == "%X00000063"

但是这里有一些复杂的问题,因为CLI会将该值解释为成功(奇数值)或失败(偶数值),在后一种情况下,调用您设置的任何相关警告或错误处理程序,并试图检索消息文本(如果存在)。换句话说,退出状态对DCL实际上意味着什么,例如在这个著名的复活节彩蛋中:

代码语言:javascript
复制
$ perl -e "exit 2928;"
%SYSTEM-W-FISH, my hovercraft is full of eels

您可以使用"vmsish 'hushed'“杂注来抑制消息的打印,当您正在打印消息时,您还需要使用"vmsish 'exit'”杂注来阻止将0映射到一般成功值,将1映射到泛型失败值,前提是这些值在您可能返回的数字范围内。这样看起来就像:

代码语言:javascript
复制
$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
  $STATUS == "%X10000B70"

注意,对于偶数的退出值,仍然可以调用处理程序。

票数 1
EN

Stack Overflow用户

发布于 2012-03-15 20:11:15

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

代码语言:javascript
复制
perl -MMy::Module -e 'My::Module->new->method;';echo $?

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

这是一个非常具体的答案,因为你不用发布你的代码就能得到它。

票数 0
EN

Stack Overflow用户

发布于 2012-03-19 01:29:53

有几种可能性,我可以想象(从来没有真正做过)。

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

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

我倾向于赞成后一种选择。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9727162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档