- ベストアンサー
system関数を使用してJava実行(戻り値取得)
こんにちは。 perlのsystem()関数を使用してJavaを実行し Javaの戻り値をPerlに返す。 以上の事を行いたいのですが、出来ません。 私が作成したソースと実行時のエラーを載せますので、 ご助言お願い致します。 尚、OSはLinuxです。 ----------------------- - Perl (CallTest.cgi) - ------------------------------------- #!/usr/bin/perl print "=== JavaCall START ===\n"; $Jret = "ABC"; print "PerlReturnBefore : " . $Jret . "\n"; $Jret = system("java Test"); print "PerlReturnAfter : " . $Jret . "\n"; -------------------- - Java (Test.java) - ------------------------------------- class Test { public static String main(String args[]) { String ret = "XYZ"; return ret; } } ------------ - 実行結果 - ------------------------------------- #perl CallTest.cgi === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : 256 ------------------------------------- 期待している実行結果は === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : XYZ です。 Javaの[public static String main]には戻り値が設定できないのでしょうか? 申し訳ありませんがご教授お願い致します。 以上の質問はPerlのカテゴリで良いのでしょうか? Javaのカテゴリにしたら良かったでしょうか? 場違いの質問でしたらスミマセン。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
> 試してはみましたが、-1が返ってきます。 そうですか。 以下のソースで試したらうまくいったんですが。 //--------------------------- // test.java //--------------------------- class test { public static void main(String[] args) { System.out.print("XYZ"); } } #---------------------------- # test.pl #---------------------------- $ret = `java test`; print "\$ret = ", $ret, "\n"; -------- 実行結果 -------- $ret = XYZ
その他の回答 (7)
- HOGERA3
- ベストアンサー率35% (50/139)
>System.out.printで標準出力を使うだけでは、 >解決しないのです。 (No.3 回答に対するお礼 より) え? No.3の方の方法で、期待している実行結果 PerlReturnAfter : XYZ が得られると思うのですが。 試してみましたか?
お礼
ご回答有難う御座います。 Perlの方での出力 print "PerlReturnAfter : " . $Jret . "\n"; で表示されるのでしょうか? 試してはみましたが、-1が返ってきます。 PerlReturnAfter : -1 falseが返ってきているという事でしょうか? もし、そうなのであれば実行の仕方等に問題がありそうですね。
- tatsu99
- ベストアンサー率52% (391/751)
>System.exitを使用してみましたが、返される値は10進なのでしょうか? >System.exit(1)の場合は、戻り値:256 >System.exit(2)の場合は、戻り値:512 戻り値は256倍した値が返されます。従って 1->256 2->512となります。又戻り値は最大255までしか 指定出来ません。
お礼
ご回答有難うございます。 やはりそうなのですか・・・ 今回期待しているのは 「文字列の戻り値を返したい」 という事なので、他の方法で実装しようと思います。 (戻り値をファイルに出力させ、Perlで読み込む方法)
- HOGERA3
- ベストアンサー率35% (50/139)
> Perl側で取得した戻り値の値が変わりました。 > どういう意味なんでしょう・・・? $Jret = system("java Test"); の場合は、JavaVMの終了ステータスが $Jretに入る。 $Jret = `java Test`; の場合は、「java Test」を実行したときの出力が$Jretに入る。 という違いでしょう。 なぜ後者の場合に65280となるのかはわかりません。
お礼
ご回答有難う御座います。 もう少し調査が必要ですね・・・
- symgt
- ベストアンサー率56% (68/120)
文字列を返すことは出来ませんが、System.exit(int)でJavaVMの終了ステータスを 指定できます。 class Test { public static void main(String args[]) { System.exit(1); } } とすれば、戻り値(int)を取得出来るはずです。
お礼
ご回答有難う御座います。 System.exitを使用してみましたが、返される値は10進なのでしょうか? System.exit(1)の場合は、戻り値:256 System.exit(2)の場合は、戻り値:512 どいう具合になってしまいます。 Javaでの戻り値の設定の仕方、Perlでの受け方・・・ 何が駄目なのかまだ分かりません。 以上の事をこれから調査しようと思っています。
- terra5
- ベストアンサー率34% (574/1662)
public static void main(String[] args) がエントリですから、これが無ければ実行しようとしても Exception in thread "main" java.lang.NoSuchMethodError: main となって、何も実行されません。 また、戻り値は返せる場合も数値だけですから、 文字列を返すような場合は、標準出力を使うのが一般的でしょう。 例えば、#1の方の回答にあるように $Jret = `java Test`; とし、 class Test { public static void main(String args[]) { String ret = "XYZ"; System.out.print(ret); } } です。
お礼
ご回答有難う御座います。 戻り値を元にPerl側で別処理を行うので System.out.printで標準出力を使うだけでは、 解決しないのです。 しかし、文字列を返すのは難しいようですね・・・
- HOGERA3
- ベストアンサー率35% (50/139)
No.1です。 Javaってmainに戻り値指定できましたっけ? public static void main(String[] args) だったと思うんですけど。 エラーメッセージでも 「そんなメソッド無いよ」 って言ってますよね。 「Stringを返すmainなんて知らない」ってことではないでしょうか。
お礼
> Javaの[public static String main]には戻り値が設定できないのでしょうか? 私も以上でで申しました通り、 出来るか?出来ないか分かりません。 出来なのであれば、戻り値となるものをファイルに出力しておいて、 Perlの方で読み込む等の対策を練る必要がありますね。
- HOGERA3
- ベストアンサー率35% (50/139)
$Jret = system("java Test"); ではなくて $Jret = `java Test`; (バッククオートで囲む)にしてみては?
お礼
ご回答有難う御座います。 バッククオートで試しましたがエラーは変わらずです。 しかし、Perl側で取得した戻り値の値が変わりました。 どういう意味なんでしょう・・・? PerlReturnAfter : 256 ↓ PerlReturnAfter : 65280 ご回答頂き、更にご質問する形になる事、お許しください。
お礼
ありがとうございます。できました。 $ret = `java test`; ではなく、 $ret = system(`java test`); とやっていました。 system()の実行結果を返していたんですね。