0

Perl スクリプト内にある Perl 関数を呼び出す必要がある DCL スクリプトがあります。DCL スクリプトでその Perl 関数の出力をキャプチャするにはどうすればよいですか?

おそらく次のように Perl スクリプトを呼び出すことができると思います。

$ perl my_perl_script.pl

しかし、Perl モジュールで特定の関数を呼び出し、その関数からの戻り値を DCL スクリプトで使用できるようにしたいと考えてます。

4

3 に答える 3

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 が一般的な成功にマッピングされるのを防ぐこともできます。 value と 1 を一般的な失敗値に設定します。これらが返される可能性のある数値の範囲内にあると仮定します。したがって、次のようになります。

$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
  $STATUS == "%X10000B70"

ハンドラーは、偶数の終了値に対しても呼び出される可能性があることに注意してください。

于 2012-04-22T19:31:02.283 に答える
0

system()それがモジュールであり、関数(または同様のもの)でシェルにアクセスできる場合、次のことができます

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

My::Moduleモジュールmethodの名前で、呼び出したいメソッドの名前です。このecho $?コマンド (Linux/Unix システムを使用していると仮定) は、シェルが受け取ったメソッド呼び出しからの戻り値を教えてくれます。

これは、コードを投稿せずに得られるのと同じくらい具体的な答えです。

于 2012-03-15T20:11:15.993 に答える
0

考えられる可能性がいくつかあります(実際に行ったことはありません)。

関数を呼び出して結果を STDOUT に出力する Perl スクリプトを作成します。次に、DCL スクリプトで、その出力をファイルにキャプチャし、読み込んで使用することができます。あるいは、PIPE 経由で出力をキャプチャして処理することもできます。出力が何であるか、そしてそれで何をしたいかによって異なります。

あるいは、シンボルの取得と設定を可能にする Perl 用の OpenVMS モジュールがいくつかあるようです。これらのいずれかを見つけることができれば、Perl スクリプトは、DCL コマンド ファイルでその時点から使用されるシンボルを設定できます。

私は後者のオプションを好む傾向があります。

DCL から Perl 関数を直接呼び出す方法はないと思います。DCL レベルで他の言語から関数を呼び出す方法があるのと同じです。

于 2012-03-19T01:29:53.643 に答える