質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

2回答

4187閲覧

perlスクリプト上から外部プログラムの呼び出し

misaki_f

総合スコア6

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2018/05/02 05:16

かなり以前より動かしているperlスクリプト群があるのですが、モジュールの動作の関係で、perlインタプリタを更新することになりました。

すると、今まで動作していたスクリプトの内、一部不具合が出てくるようになりました。ご助力いただけると幸いです。
尚、動作環境は以下のとおりです。
OS:WindowsXP 32bit
Perl:v5.12.1(ActivePerl)からv5.26.2.1(StrawberryPerl)

今回、インタプリタの更新に伴って、ActivePerlからStrawberryPerlに切り替えてみたのですが、もしかしたらこれも原因の一つかもしれません。

該当のソースコード

perl

1#下記の変数はそれぞれ値は代入されているものとします。 2my $aaa; 3my $bbb; 4my $ccc; 5system("call java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt");

本来なら$ccc.txtにaaa.jarの実行結果が入るはずですが、$ccc.txtを参照しても何も表示されない(空のファイルの状態)。

試したこと

aaa.jarに関してはコマンドプロンプト上からは正常にプログラムが動作することを確認しています。
また、

java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt

という形でコマンドプロンプトから実行したところ、結果は正常に$ccc.txtに格納されました。

perl

1my $aaa; 2my $bbb; 3my $ccc; 4system("call", "java", "-jar", "aaa.jar", "-cmip", "$aaa", "-cmmac", "$bbb", ">$ccc.txt");

という書式に変更してもダメでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

可能性としては、
・スクリプト動作時にjava.exeにパスが通っていない
・aaa.jarがスクリプトのプロセスのカレントディレクトリにない
など。

投稿2018/05/02 13:17

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misaki_f

2018/05/05 07:05

コマンドをコマンドプロンプト上から直接叩くと問題なく動作するので、多分java.exeにパスが通ってないはずはないかと。 aaa.jarはperlスクリプトと同一ディレクトリに保存していますが、これだと問題なのでしょうか?
KojiDoi

2018/05/05 07:50

たとえば、system("java -help >c:\test.txt")としてみて、c:\test.txtにjavaのヘルプがセーブされるか? これがうまくいくようならjava.exeの呼び出しにはせいこうしているということになります。 次に、system("java -jar フルパス/aaa.jar >c:\test.txt")としてみて、c:\test.txtとしてみて正常な結果が返ってくるか。これがうまくいくならファイル名指定の問題だし、これがうまくいかないなら別のところに問題があります。最後に、system("java -jar フルパス/aaa.jar >c:\test.txt 2>c:\error.txt")などとして、error.txtになにかエラーが出てこないか見てみてはどうでしょう。こんな感じで「絶対うまくいくはずのsystem()」から徐々に本番の状況に寄せていって問題を確かめるしかないと思います。
otn

2018/05/05 12:42

> コマンドをコマンドプロンプト上から直接叩くと問題なく動作するので、 コマンドプロンプトと、Perlプロセス内とで、PATH環境変数が同一であることが確認取れていれば良いのですが。 > aaa.jarはperlスクリプトと同一ディレクトリに保存していますが、これだと問題なのでしょうか? スクリプトと同一ディレクトリかどうかは関係ありません。 あくまで、カレントディレクトリにあるかどうかです。 カレントディレクトリの意味がわからなければ、aaa.jar 等も全部ファイルはフルパスで指定してください。
guest

0

java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt

$bbb $ccc の中身は何でしょうか? ダブルクオーテーションで括ると変数が展開されますから、シェルに渡されて実行されるのはこういう形ではないはずですね。

投稿2018/05/02 07:00

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misaki_f

2018/05/02 07:15 編集

失礼しました。 $aaaはipアドレス(IPv4) $bbbはMACアドレスになります。 $cccは適当な文字列を挿入しています。 当然ながらコマンドプロンプトにて実行する際はそれぞれ値を置換しています。 java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt についてprintで出力してみると各変数は予め代入した値で展開されていましたので、各変数の値は正常と思います。
KojiDoi

2018/05/02 07:26

カレントディレクトリはどうなっていますか。あと、system()から呼び出すときに限ってcallをつけている意図は何ですか?
misaki_f

2018/05/05 07:02

カレントディレクトリはperlスクリプトの存在する階層でした。また、aaa.jarも同一ディレクトリに存在しています。 callについては、申し訳ありません。この「call」についてはどう言う意味かよくわからなくて。 java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt でも call java -jar aaa.jar -cmip $aaa -cmmac $bbb > $ccc.txt でもコマンドプロンプトからはどちらも挙動は変わりませんでした。尚、system();経由だとcallの有無関係なしに動作しませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問