从Java运行Perl脚本(嵌入在Perl中)
Perl通过STDIN接受scipt。按下CTRL-D后,perl知道“脚本结束”。执行此操作后,将执行脚本 现在我的问题是:我想从Java实现这一点从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中模拟预期行为的适当操作 如果你想做“其他
但这正是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();
}
}