为什么这个perl脚本有时会在系统运行后停止打印
在我改变之后:为什么这个perl脚本有时会在系统运行后停止打印,perl,printing,system,Perl,Printing,System,在我改变之后: system("recode ISO-8859-1..UTF-8 $csvPath"); if($? == -1) { die(" failed\n"); } 致: 它工作得更好,但仍然不总是如此 代码段: 这种情况并非总是发生。有时有效,有时无效 如果它不起作用(在这种情况下,脚本没有完成),第一次打印会起作用,但是第二次带有“完成!”的打印永远不会打印,即使外部命令起作用。如果($?=-1)没有多大意义,您的测试$?将为0,如果命令失败,则为非0。例如,如果命令执
system("recode ISO-8859-1..UTF-8 $csvPath");
if($? == -1) {
die(" failed\n");
}
致:
它工作得更好,但仍然不总是如此
代码段:
这种情况并非总是发生。有时有效,有时无效 如果它不起作用(在这种情况下,脚本没有完成),第一次打印会起作用,但是第二次带有“完成!”的打印永远不会打印,即使外部命令起作用。如果($?=-1)没有多大意义,您的测试
<如果命令成功,代码>$?
将为0,如果命令失败,则为非0。例如,如果命令执行退出(1)
,$?
应该是256——至少在类Unix系统上是这样。测试system()
返回的值可能比事后检查$@
更干净
尝试设置$|=1代码>位于程序顶部;这将使您的输出无缓冲,并可能让您在脚本死之前看到脚本正在生成的某些输出
在执行命令字符串之前,请打印其确切值。如果$cvsPath
是一个空字符串(或者如果它是undef
并且您没有启用警告),那么您在调用recode
时没有文件参数,它将从标准输入中读取。这也许可以解释你看到的行为
尽管这与您的问题没有直接关系,但如果system()
只提供了一个参数,并且该参数包含shell元字符(包括空格),则该命令由shell执行。对于多个参数,它直接调用命令:
system('recode', 'ISO-8859-1..UTF-8', $csvPath);
perldoc-f系统
了解更多信息
事实上,如果问题的原因是$cvsPath
的错误值,那么这可能会暴露问题,因为它会将一个空字符串作为单独的参数传递给recode
。在这种情况下产生的错误消息是:
recode: fopen (): No such file or directory
(空文件名显示在括号之间)
请注意,其中很多都是基于不完整信息的猜测。如果($?=-1)
没有多大意义,那么发布一个显示问题的完整的小程序会使这变得容易得多。您的测试<如果命令成功,代码>$?
将为0,如果命令失败,则为非0。例如,如果命令执行退出(1)
,$?
应该是256——至少在类Unix系统上是这样。测试system()
返回的值可能比事后检查$@
更干净
尝试设置$|=1代码>位于程序顶部;这将使您的输出无缓冲,并可能让您在脚本死之前看到脚本正在生成的某些输出
在执行命令字符串之前,请打印其确切值。如果$cvsPath
是一个空字符串(或者如果它是undef
并且您没有启用警告),那么您在调用recode
时没有文件参数,它将从标准输入中读取。这也许可以解释你看到的行为
尽管这与您的问题没有直接关系,但如果system()
只提供了一个参数,并且该参数包含shell元字符(包括空格),则该命令由shell执行。对于多个参数,它直接调用命令:
system('recode', 'ISO-8859-1..UTF-8', $csvPath);
perldoc-f系统
了解更多信息
事实上,如果问题的原因是$cvsPath
的错误值,那么这可能会暴露问题,因为它会将一个空字符串作为单独的参数传递给recode
。在这种情况下产生的错误消息是:
recode: fopen (): No such file or directory
(空文件名显示在括号之间)
请注意,其中很多都是基于不完整信息的猜测。发布一个显示问题的完整的小程序会使这变得容易得多。在我看来,如果脚本运行到最后,打印应该会发生。剧本写完了吗?在此上下文中的重要信息是您使用的是什么操作系统,以及您使用的是什么shell。不,脚本没有完成。系统是GNU/Linux。用户有bashshell,system
调用等待子进程完成,所以这似乎就是问题所在。阅读。另外,我怀疑这更像是linux/Unix标记的问题,如果有,请重新编码。@peko,有三种可能性。1) 执行了die
或print
,但您没有注意到(由于缓冲或异常捕获等原因)。2) 系统
未返回,因为子项未结束。3) Perl进程被终止(比如被一个信号终止)。在我看来,如果脚本运行到最后,打印应该发生。剧本写完了吗?在此上下文中的重要信息是您使用的是什么操作系统,以及您使用的是什么shell。不,脚本没有完成。系统是GNU/Linux。用户有bashshell,system
调用等待子进程完成,所以这似乎就是问题所在。阅读。另外,我怀疑这更像是linux/Unix标记的问题,如果有,请重新编码。@peko,有三种可能性。1) 执行了die
或print
,但您没有注意到(由于缓冲或异常捕获等原因)。2) 系统
未返回,因为子项未结束。3) Perl进程被终止(例如被信号终止)。