【问题标题】:How do I call a Perl function from a DCL script?如何从 DCL 脚本调用 Perl 函数?
【发布时间】:2012-03-15 19:53:59
【问题描述】:

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

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

$ perl my_perl_script.pl

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

【问题讨论】:

    标签: perl vms dcl


    【解决方案1】:

    多年来,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"
    

    请注意,仍然可以为偶数退出值调用处理程序。

    【讨论】:

      【解决方案2】:

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

      perl -MMy::Module -e 'My::Module->new->method;';echo $?
      

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

      这与您在不发布代码的情况下将获得的答案一样具体。

      【讨论】:

        【解决方案3】:

        我能想到几种可能性(以前从未真正做过)。

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

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

        我倾向于后一种选择。

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

        【讨论】:

        猜你喜欢
        • 2012-03-08
        • 1970-01-01
        • 2023-03-17
        • 2012-07-23
        • 2011-01-31
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        相关资源
        最近更新 更多