Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个perl脚本有时会在系统运行后停止打印_Perl_Printing_System - Fatal编程技术网

为什么这个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进程被终止(例如被信号终止)。