从Java运行Perl脚本(嵌入在Perl中)

从Java运行Perl脚本(嵌入在Perl中),java,perl,pipe,eof,Java,Perl,Pipe,Eof,Perl通过STDIN接受scipt。按下CTRL-D后,perl知道“脚本结束”。执行此操作后,将执行脚本 现在我的问题是:我想从Java实现这一点 开放进程Perl 将脚本复制到Perl进程的STDIN中 如何在不关闭流的情况下向PERL发送CRTL-D信号(从 在java中) 向脚本发送一些输入 从脚本中获取一些输出 但这正是CTRL-D所做的:关闭进程的STDIN。因此,在您的示例中,关闭proc.getInputStream()是在shell中模拟预期行为的适当操作 如果你想做“其他

Perl通过STDIN接受scipt。按下CTRL-D后,perl知道“脚本结束”。执行此操作后,将执行脚本

现在我的问题是:我想从Java实现这一点

  • 开放进程Perl
  • 将脚本复制到Perl进程的STDIN中
  • 如何在不关闭流的情况下向PERL发送CRTL-D信号(从 在java中)
  • 向脚本发送一些输入
  • 从脚本中获取一些输出


  • 但这正是CTRL-D所做的:关闭进程的STDIN。因此,在您的示例中,关闭proc.getInputStream()是在shell中模拟预期行为的适当操作

    如果你想做“其他事情”,就去做吧。就像通过STDIN向脚本中写入一个特殊命令,然后STDIN将其解释为另一种状态或任何需要的状态

    此示例正是您所需要的:

    public class TestPl {
    public static void main(String[] args) {
      Process proc;
      try {
         proc = Runtime.getRuntime().exec("perl");
         // a simple script that echos stdin.
         String script = "my $s=<>;\n" +
                         "print $s;";
    
         OutputStreamWriter wr = new OutputStreamWriter(proc.getOutputStream());
    
         //write the script:
         wr.write(script);
    
         //signal end of script:
         wr.write(4);
         wr.write("\n");
    
         //write the input:
         wr.write("bla bla bla!!!");
    
         wr.flush();
         wr.close();
    
         String output = readFromInputStream(proc.getInputStream());
         proc.waitFor(); 
         System.out.println("perl output:\n"+output);
      } catch (IOException e) {
         e.printStackTrace();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
    }
    
    public static String readFromInputStream(InputStream inputStream) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
      String line;
      StringBuffer buff = new StringBuffer();
      while ((line=br.readLine())!=null){
         if (buff.length() > 0){
            buff.append("\n");
         }
         buff.append(line);
      }
      br.close();
      return buff.toString();
    }
    
    }
    
    公共类TestPl{
    公共静态void main(字符串[]args){
    过程过程;
    试一试{
    proc=Runtime.getRuntime().exec(“perl”);
    //与stdin相呼应的简单脚本。
    String script=“my$s=;\n”+
    “打印$s;”;
    OutputStreamWriter wr=新的OutputStreamWriter(proc.getOutputStream());
    //编写脚本:
    wr.write(脚本);
    //脚本的信号结束:
    wr.write(4);
    wr.写入(“\n”);
    //编写输入:
    写(“呜呜呜呜!!!”;
    wr.flush();
    wr.close();
    字符串输出=readFromInputStream(proc.getInputStream());
    进程waitFor();
    System.out.println(“perl输出:\n”+输出);
    }捕获(IOE异常){
    e、 printStackTrace();
    }捕捉(中断异常e){
    e、 printStackTrace();
    }
    }
    公共静态字符串readFromInputStream(InputStream InputStream)引发IOException{
    BufferedReader br=新的BufferedReader(新的InputStreamReader(inputStream));
    弦线;
    StringBuffer buff=新的StringBuffer();
    而((line=br.readLine())!=null){
    如果(buff.length()>0){
    buff.append(“\n”);
    }
    buff.append(行);
    }
    br.close();
    返回buff.toString();
    }
    }
    

    但是当我关闭Outputstream(到脚本的STDIN)时,我不能再使用它了。在外壳中,这是可能的。运行perl。输入als脚本
    $line=;打印$行然后按CTRL-D。。。现在脚本运行并可以响应您的inputHmm,我的java知识有点生疏,但是当您说OutputStream时,您是指proc.getOutputStream()还是getInputStream()?因为我认为getInputStream是进程的标准格式。请确保在脚本中写入“\n”(换行符)。这将使$line=不再阻塞。。。现在可以工作了我想将脚本嵌入jar文件并通过stdin将其传输到perl…如果您将
    \uuuu END\uuuu
    写入perl而不是关闭stdin会发生什么?(或
    ^D
    ^Z
    --请参见)我不知道为什么,但用一个小脚本就可以了,但用我的大脚本就不行了。。。我想我会将脚本写入一个临时文件并加载它…我现在为脚本使用一个临时文件。但我会试试你的密码。。。因为我不喜欢临时文件。谢谢,它不起作用。脚本应该输出一个“OK”字符串。我不明白->脚本没有正确启动。。。出什么问题了?您认为STD输出中写入了“OK”吗?也许脚本会把它写到STDERR?我在一些SQL转换脚本中使用了这段代码,它是有效的,但是如果你想,你可以给我发送一个不工作脚本的示例,我会检查它。是的,我确定,因为下面的工作(但不是很理想):将脚本写入Tempfile;运行“PERL mytempfile”
    public class TestPl {
    public static void main(String[] args) {
      Process proc;
      try {
         proc = Runtime.getRuntime().exec("perl");
         // a simple script that echos stdin.
         String script = "my $s=<>;\n" +
                         "print $s;";
    
         OutputStreamWriter wr = new OutputStreamWriter(proc.getOutputStream());
    
         //write the script:
         wr.write(script);
    
         //signal end of script:
         wr.write(4);
         wr.write("\n");
    
         //write the input:
         wr.write("bla bla bla!!!");
    
         wr.flush();
         wr.close();
    
         String output = readFromInputStream(proc.getInputStream());
         proc.waitFor(); 
         System.out.println("perl output:\n"+output);
      } catch (IOException e) {
         e.printStackTrace();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
    }
    
    public static String readFromInputStream(InputStream inputStream) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
      String line;
      StringBuffer buff = new StringBuffer();
      while ((line=br.readLine())!=null){
         if (buff.length() > 0){
            buff.append("\n");
         }
         buff.append(line);
      }
      br.close();
      return buff.toString();
    }
    
    }