Запуск Perl-Script из Java (встроенный в Perl) - PullRequest
5 голосов
/ 02 ноября 2011

Perl принимает скипт через STDIN.После нажатия CTRL-D Perl знает «Конец скрипта».После этого скрипт выполняется.

Теперь мой вопрос: я хочу сделать это из Java.

  1. Открыть процесс Perl
  2. Скопировать скрипт в STDIN изPerl-Process
  3. КАК Я СИГНАЛИЗИРУЮ Perl CRTL-D БЕЗ ЗАКРЫТИЯ ПОТОКА (изнутри java)
  4. Отправить некоторые входные данные в сценарий
  5. получить некоторые выходные данные из сценария.

proc = Runtime.getRuntime().exec("perl", env);
commandChannel = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
responseChannel = new BufferedReader(new InputStreamReader(proc.getInputStream()));
InputStreamReader mymacro = new InputStreamReader(getClass().getResourceAsStream("macro.perl"));

char[] b = new char[1024];
int read;

try
{
    while ((read = mymacro.read(b)) != -1)
    {
        commandChannel.write(b, 0, read);
    }
    commandChannel.flush();
    PERL IS WAITING FOR END OF SCRIPT; ??
}  ...

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

этот пример делает именно то, что вам нужно:

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();
}

}

1 голос
/ 02 ноября 2011

Но это именно то, что делает CTRL-D: закрытие STDIN процесса. Так что в вашем случае закрытие proc.getInputStream () - это подходящее действие, чтобы иметь ожидаемое поведение при моделировании его в оболочке.

Если вы хотите сделать что-то еще, просто сделайте это. Как написать специальную команду для вашего скрипта через STDIN, которая затем интерпретирует ее как таковую и переходит в другое состояние или что угодно

...