0

我正在编写一个需要调用 Perl 脚本来做一些事情的小工具。

我已经知道并编写了如何调用它的代码,但我必须为exec().

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

我想稍后生成一个可执行的 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?

4

3 回答 3

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();
于 2012-04-09T19:41:09.730 回答
1

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

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

希望能帮助到你...

于 2012-04-09T18:35:28.150 回答
0

您可以将脚本写到一个文件中,比如一个临时文件,然后从那里执行它,然后在完成后将其删除。

于 2012-04-09T18:35:08.757 回答