如何从我的Java程序中执行Perl脚本?

时间:2012-04-09 18:12:27

标签: java perl embedded-script

我正在编写一个需要调用Perl脚本来执行某些操作的小工具。

我已经知道并编写了如何调用它的代码,但我必须提供exec()的Perl脚本的完全限定路径。

是否有可能将该脚本作为一种可以直接调用的包提供?

我想稍后生成一个可执行的JAR,并希望还有整个工具来提供Perl脚本,而不是知道它的位置。

目前就像:

private void extractAudioStream() {
    inputFile = "C:\\Users\\Stefan\\Documents\\temp_tshark\\forward_stream.pcap";
    outputFile_audiostream = "C:\\Users\\Stefan\\Documents\\temp_tshark\\forward_stream.pcm";

    String perl_cmd = "perl C:\\Users\\Stefan\\Documents\\tshark_bin\\rtp_dump.pl " + inputFile + " " + outputFile_audiostream;

    try {
        p = Runtime.getRuntime().exec(perl_cmd);

希望问题很清楚。

我认为这可能不那么简单,因为系统perl命令等待着 完全合格的路径?那么有没有可能发现我的 当前位置并将其传递给我的cmd-String?

3 个答案:

答案 0 :(得分:2)

String perl_cmd = "perl -e \"print \\\"bla\\n\\\";\";"
Runtime.getRuntime().exec(perl_cmd);

修改:我忘了在-e和脚本之间留一个空格;你还必须在脚本中转义反斜杠和双引号(如果你是Java中的内联脚本,而不是从jar文件中读取它,则两次),这使得多行内容有点尴尬。

因此,使用Process.getOutputStream将脚本编写到Perl解释器的标准输入可能会更好:

  String perlScript = "print \"hello\";"; // get from a jar with Class.getResourceAsStream()
  Process p = new ProcessBuilder("perl").redirectErrorStream(true).redirectOutput(ProcessBuilder.Redirect.INHERIT).start();
  BufferedWriter w = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
  w.write(perlScript);
  w.close();
  p.waitFor();

答案 1 :(得分:1)

如果您在字符串中读取/存储perl脚本,则可以像这样执行:

perlScript = "print \"HELLO\\n\"; print \"CIAOOOO\\n\";";
String perl_cmd = "echo \"" + perlScript + "\" |perl";
Runtime.getRuntime().exec(perl_cmd);

希望它有所帮助...

答案 2 :(得分:0)

您可以将脚本写入文件,例如临时文件,然后从那里执行,然后在完成后将其删除。