一些Perl行不会从Java Runtime.getRuntime()执行.exec()

时间:2015-07-13 12:36:52

标签: java perl

从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;但这不是问题;)

1 个答案:

答案 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,这样您就会得到错误行。