从Java调用perl脚本时,我有一种奇怪的行为。
perl代码是:
#!/usr/bin/env perl
use warnings;
print "dada\n";
$file = "settings.txt";
open $ds, "<", $file;
print "doudou\n";
while ($line = <$ds>){
print "$line\n";
last if $. == 4;
}
print "dodo\n";
close $ds;
正如您所看到的,在此代码中我想读取文件&#34; settings.txt&#34;内容:
1 : a
2 : b
3 : c
4 : d
这个脚本在从cygwin调用时起作用,输出为:
dada
doudou
1 : a
2 : b
3 : c
4 : d
dodo
但是当我使用以下代码从Java调用它时:
String line;
String cmd = "perl C:\\Data\\Tests\\match_settings.pl";
try {
Process proc = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while ((line = in.readLine()) != null) {
System.out.println("Line :" + line);
}
in.close();
} catch (IOException a) {
// TODO Auto-generated catch block
a.printStackTrace();
}
然后当执行Java函数时,我得到输出:
Line :dada
Line :doudou
Line :dodo
这意味着$line = <$ds>
执行得不好,但我不知道原因。
有什么想法吗?
很抱歉这篇长篇文章,希望尽可能准确。
PS:我知道有些人想知道&#34;为什么不自己用Java代码读取settings.txt文件?&#34;但这不是问题;)
答案 0 :(得分:2)
从Cygwin和Java执行时,执行perl代码的文件夹似乎不一样。因此perl脚本无法找到您的文件。
您应该在perl代码中添加错误检查,并验证当前正在运行的目录。
我会写:
#!/usr/bin/env perl
use warnings;
use Cwd;
my $cwd = cwd();
print "dada\n";
print "In folder: $cwd";
$file = "settings.txt";
open ($ds, "<", $file) || die "Can't open settings.txt. Error code: $!";
print "doudou\n";
while ($line = <$ds>){
print "$line\n";
last if $. == 4;
}
print "dodo\n";
close $ds;
这将帮助您调试为什么,当您从Java执行脚本时,您无法获得预期的结果。
您还应该在Java代码中将stderr重定向到stdout,这样您就会得到错误行。