我换了之后:
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");
这种情况不会一直发生。有时它有时不起作用。
如果它不起作用(脚本在这种情况下没有完成)第一个打印工作,但第二个打印“完成!”即使外部命令有效,也从不打印。
答案 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
(空文件名显示在括号之间)。
请注意,很多这是基于不完整信息的猜测。发布一个展示问题的小型完整程序会使这更容易。