为什么这个perl脚本有时会在系统函数后停止打印

时间:2011-07-11 14:03:34

标签: perl printing system

我换了之后:

system("recode ISO-8859-1..UTF-8 $csvPath");
if($? == -1) {
    die(" failed\n");
}

为:

if(system("recode ISO-8859-1..UTF-8 $csvPath")) {
        die(" failed!");
}

效果更好,但并非总是如此。

代码段:

print("recoding file to utf-8...");
#`recode ISO-8859-1..UTF-8 $csvPath`;
system("recode ISO-8859-1..UTF-8 $csvPath");
if($? == -1) {
   die(" failed\n");
}
print(" done!\n");

这种情况不会一直发生。有时它有时不起作用。

如果它不起作用(脚本在这种情况下没有完成)第一个打印工作,但第二个打印“完成!”即使外部命令有效,也从不打印。

1 个答案:

答案 0 :(得分:3)

您的测试if($? == -1)没有多大意义。如果命令成功,则$?将为0;如果失败,则为{0}。例如,如果命令执行exit(1),则$?应为256 - 至少在类Unix系统上。测试system()返回的值而不是事后检查$@可能更清晰。

尝试在程序顶部设置$| = 1;;这会使你的输出无缓冲,并且可能会让你看到你的脚本在它死之前产生的一些输出。

在执行命令字符串之前打印确切的值。如果$cvsPath是一个空字符串(或者它是undef并且您没有启用警告),那么您将调用recode而没有文件参数,它将从标准输入读取。这可能解释了你所看到的行为。

虽然这与您的问题没有直接关系,但如果给system()一个参数,并且该参数包含shell元字符(包括空格),那么命令由shell执行。使用多个参数,它直接调用命令:

system('recode', 'ISO-8859-1..UTF-8', $csvPath);

perldoc -f system了解更多信息。

事实上,如果$cvsPath的错误值是问题的原因,那可能会揭示它,因为它会将空字符串作为单独的参数传递给recode。在这种情况下,错误消息recode产生:

recode: fopen (): No such file or directory

(空文件名显示在括号之间)。

请注意,很多这是基于不完整信息的猜测。发布一个展示问题的小型完整程序会使这更容易。