如何从Perl管道输入到Java命令?

spu*_*dly 6 perl command pipe

我需要通过Java程序运行一个字符串,然后检索输出.Java程序通过标准输入接受字符串.以下作品:

my $output = `echo $string | java -jar java_program.jar`;
Run Code Online (Sandbox Code Playgroud)

有一个问题:$string可能是任何事情.有关这个问题的良好解决方案的任何想法?

Tod*_*lin 6

如果您可以使用CPAN模块(我假设大多数人都可以),请查看Ivan关于使用IPC :: Run3 的答案.它应该处理你需要的一切.

如果你不能使用模块,这里是如何以普通的方式做事.

您可以使用管道进行输入,它将避免所有这些命令行引用问题:

open PIPE, "| java -jar java_program.jar";
print PIPE "$string";
close(PIPE);
Run Code Online (Sandbox Code Playgroud)

看起来你实际上需要输出命令.您可以打开两个管道,例如IPC :: Open2(进出 java进程),但是你可能会陷入僵局,试图同时处理这两个管道.

您可以通过将java输出到文件,然后从该文件中读取来避免这种情况:

open PIPE, "| java -jar java_program.jar > output.txt";
print PIPE "$string";
close(PIPE);

open OUTPUT, "output.txt";
while (my $line = <OUTPUT>) {
    # do something with $line
}
close(OUTPUT);
Run Code Online (Sandbox Code Playgroud)

另一种选择是反过来做事.将$ string放在一个临时文件中,然后将其用作java的输入:

open INPUT, "input.txt";
print INPUT "$string";
close(INPUT); 

open OUTPUT, "java -jar java_program.jar < input.txt |";
while (my $line = <OUTPUT>) {
    # do something with the output
}
close(OUTPUT);
Run Code Online (Sandbox Code Playgroud)

请注意,这不是执行临时文件的最佳方式; 我刚刚用过output.txt而且input.txt简单.查看File :: Temp文档,了解更清晰地创建临时文件的各种更简洁的方法.


Iva*_*uev 6

我建议你看一下IPC::Run3模块.它使用非常简单的界面,并允许获取STDERRSTDOUT.这是一个小例子:

use IPC::Run3;
## store command output here
my ($cmd_out, $cmd_err);
my $cmd_input = "put your input string here";
run3([ 'java', '-jar', 'java_program.jar'], \$cmd_input, \$cmd_out, \$cmd_err);
print "command output [$cmd_out] error [$cmd_err]\n";
Run Code Online (Sandbox Code Playgroud)

查看IPC::Run3 与其他模块的比较.