【问题标题】:How can I execute a Perl script from my Java program?如何从我的 Java 程序执行 Perl 脚本?
【发布时间】:2012-04-09 18:12:27
【问题描述】:

我正在编写一个小工具,它需要调用 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?

【问题讨论】:

    标签: java perl embedded-script


    【解决方案1】:
    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();
    

    【讨论】:

    • 如果我从命令行本地运行该命令,它不会被执行。此外,它从帮助中说:-e 编写一行程序(允许几个-e,省略程序文件)但它不仅仅是一行,它是一个完整的脚本!
    【解决方案2】:

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

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

    希望对你有帮助...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        相关资源
        最近更新 更多