2012-03-15 13 views
0

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

私は次のように私はおそらくPerlスクリプトを呼び出すことができます知っている:

$ perl my_perl_script.pl 

しかし、私はPerlモジュール 内の特定の関数を呼び出すとが私にその関数からの戻り値を使用できるようにしたいですDCLスクリプト。あなたは system()機能(または同様のもの)でシェルにアクセスできるかどうか、それはモジュールだとした場合

答えて

0

、その後、あなただけMy::Moduleが、モジュールの名前で、methodが名前です

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

を行うことができます呼び出したいメソッドの名前を指定します。 echo $?コマンド(Linux/Unixシステムを使用していると仮定)は、シェルが受け取ったメソッド呼び出しからの戻り値を通知します。

これは、あなたのコードを投稿することなく得られる答えのようなものです。

0

私が考えることのできる2つの可能性があります(前に実際に行ったことはありません)。

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

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

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

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

+0

ちょうどこれに気づいたhttp://stackoverflow.com/questions/4431757/how-to-assign-the-output-of-a-program-to-a-variable-in-a-dcl-com-script- on-vmsは、私の最初の選択肢でどのように動作するかの良い例を持っています。 – ChrisB

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で常に利用可能である$のステータスシンボル:

$ 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」プラグマ、しばらくして、メッセージの印刷を抑制することができますあなたは、あなたがそうであるかもしれない数字の範囲内にあると仮定して、 "vmsish 'exit'"プラグマを使って0を一般的な成功値にマッピングし、1を一般的な失敗値にマッピングしないようにします戻る。したがって、次のようになります。

偶数番号の出口値の場合でもハンドラーが呼び出されることがあります。

関連する問題