2010-08-30 469 views
28

我正在使用语法检查来查看我的Perl脚本是否以正确的方式被使用。如果语法不正确,我会显示一条消息,说明正确的语法,然后结束程序的执行。如何在Perl中终止程序 - 退出或死亡?

之间:

print "Please use the following syntax: ..."; 
exit 1; 

和:

die("Please use the following syntax: ..."); 

哪一个我应该使用?如果有异常处理,我知道die就是答案,但情况并非如此。

哪一个更适合程序终止,无异常处理?也请说明原因。

+5

值得注意的是'die'会自动追加文件名和行号*,除非*错误字符串以换行符结束''\ n“'。 – 2010-08-30 20:52:07

回答

34

这取决于你想在STDERR和STDOUT中发生什么。我倾向于向STDERR发送错误和警告类型消息,以便当有人试图将输出重定向到文件时,他们仍然会看到错误消息;然而,有时候,当使用STDOUT向用户传达状态时,他或她可以tail -f或对其进行分页,并且在写入STDERR的那些时间会使他们感到痛苦(他们必须将STDERR重定向回到STDOUT,而不是2>&1,而不是每个人都知道如何做到这一点)。那么使用哪一种,dieprintexit,在很大程度上取决于您正在编写什么类型的程序。

还有其他的好处/缺点使用die

  • 您可以陷阱dieeval,但不退出
  • 您可以将程序安装一个信号处理程序调用die时运行代码__DIE__信号
  • 您可以轻松地覆盖die功能

每个人都有时间能够做到这一点,以及能够完成任务的时候。

+0

如果你警告错误消息,然后使用'exit',该怎么办?你会认为获得最好的两个? – Arc676 2017-02-02 03:01:33

+1

@ Arc676考虑到'warn'写入STDERR,我也没有看到在描述的场景中,这可能比'print'和'exit'好。记住没有“最好”是很重要的。只有在某些情况下可能有益/有害的行为。一般来说,正确答案是“死”,因为这可以使程序具有最大的灵活性,但是你必须记住程序的用户将如何消耗输出。 – 2017-02-02 04:41:12

21

print打印到STDOUTdie打印到STDERR

exit 1退出时的1die退出时的errno出口电流值是$!

因此die退出状态是作为它的简单的和优选的方式短。

+5

或'$? >> 8'如果'$!'是'0'。或者255如果'$? >> 8'为0. – 2010-08-30 14:19:41

+0

@Chas:什么是'$!','$?'? – Lazer 2010-08-30 17:06:59

+1

[$ OS_ERROR](http://p3rl.org/var#%24OS_ERROR),[$ CHILD_ERROR](http://p3rl.org/var#%24CHILD_ERROR) – daxim 2010-08-30 17:40:21

相关问题