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

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

ただいまの
回答率

90.47%

  • Perl

    461questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 256

misaki_f

score 2

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

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

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

 該当のソースコード

#下記の変数はそれぞれ値は代入されているものとします。
my $aaa;
my $bbb;
my $ccc;
system("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に格納されました。

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/02 16:15 編集

    失礼しました。
    $aaaはipアドレス(IPv4)
    $bbbはMACアドレスになります。
    $cccは適当な文字列を挿入しています。
    当然ながらコマンドプロンプトにて実行する際はそれぞれ値を置換しています。

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

    についてprintで出力してみると各変数は予め代入した値で展開されていましたので、各変数の値は正常と思います。

    キャンセル

  • 2018/05/02 16:26

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

    キャンセル

  • 2018/05/05 16: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の有無関係なしに動作しませんでした。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/05 16:05

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

    キャンセル

  • 2018/05/05 16: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()」から徐々に本番の状況に寄せていって問題を確かめるしかないと思います。

    キャンセル

  • 2018/05/05 21:42

    > コマンドをコマンドプロンプト上から直接叩くと問題なく動作するので、
    コマンドプロンプトと、Perlプロセス内とで、PATH環境変数が同一であることが確認取れていれば良いのですが。

    > aaa.jarはperlスクリプトと同一ディレクトリに保存していますが、これだと問題なのでしょうか?
    スクリプトと同一ディレクトリかどうかは関係ありません。
    あくまで、カレントディレクトリにあるかどうかです。
    カレントディレクトリの意味がわからなければ、aaa.jar 等も全部ファイルはフルパスで指定してください。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Perl

    461questions

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