我需要通过Java程序运行一个字符串,然后检索输出.Java程序通过标准输入接受字符串.以下作品:
my $output = `echo $string | java -jar java_program.jar`;
Run Code Online (Sandbox Code Playgroud)
有一个问题:$string可能是任何事情.有关这个问题的良好解决方案的任何想法?
如果您可以使用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文档,了解更清晰地创建临时文件的各种更简洁的方法.
我建议你看一下IPC::Run3模块.它使用非常简单的界面,并允许获取STDERR和STDOUT.这是一个小例子:
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 与其他模块的比较.