【问题标题】:Confused by a very simple if / else statement in perl被 perl 中一个非常简单的 if / else 语句弄糊涂了
【发布时间】:2011-09-06 16:17:30
【问题描述】:
print "content-type: text/html \n\n";   #The header
$file = "newtext.txt";
if (unlink($file) == 0) {
    print "File deleted successfully.";
} else {
    print "File was not deleted.";
}

这是我从 tizag 获取的一些代码。我不明白的部分是true的bool值为1,false为0。那么为什么当我成功删除我正在检查的文件时它是否返回0?

【问题讨论】:

  • 这里的教训:如有疑问,请检查 perldoc。 perldoc perlfunc 是我学习时最好的朋友,现在仍然是。
  • 或在命令行perldoc -f unlink
  • SO Perl 常客请注意:这是tizag 第二次以加重的方式引起注意。直到有人可以精通该网站并指出所有错误并提交以进行更正,我已将此资源列为垃圾列表并建议您也这样做。

标签: perl boolean if-statement


【解决方案1】:

这似乎是一个错误..来自perldoc perlfunc

删除文件列表。成功时, 它返回它的文件数 成功删除。失败时,它 返回 false 并设置 $! (错误号):

如果返回值为0,你删除了0个文件。

正确的写法是:

if (unlink($file)) { print "Success!" }
else { print "Unlink failed: $!" }

【讨论】:

  • 还有更惯用的unlink $file or die "unlink $file failed: $!"。使用 autodie 为您处理此问题。它随 5.10.1 一起提供。 search.cpan.org/perldoc?autodie
【解决方案2】:

实际上,我认为这是一个错误。来自perldoc for unlink

成功时,它返回成功删除的文件数。失败时,它返回 false 并设置 $! (错误)

可能是自动驾驶仪上的shell编程。

【讨论】:

    【解决方案3】:

    sn-p 可能是错误的,因为unlink 返回成功删除的文件数。

    【讨论】:

      【解决方案4】:

      好的,别在意我的第一反应。这是来自用于取消链接的 perldoc:

      删除文件列表。成功时,它返回它成功删除的文件数。失败时,它返回 false 并设置 $! (错误)

      证明没有标准这样的东西。还证明编写该代码的人不幸有一个错误。就我个人而言,我预计 0 意味着成功。如果您查看 C 系统调用 unlink,则零表示成功。完全疯狂,我告诉你。

      【讨论】:

      • 这允许更易读的版本if (unlink('file')) { print "success" } else {print "failed"},不是它不是 C 等价物,但 Perl 不是 C,这是一个常见的 Perl 习惯用法。
      • 有人愿意解释反对意见吗?我相信我的答案和其他人完全一样。
      • 除了整个“C 是这样做的,所以 perl 也应该......”你的意思是。当脚本语言不是调用 C 函数的薄薄的胶合板时,它们会更好;那么您就不会发送诸如 php 的 mysql_real_escape_string() 泄漏到库中的混乱。
      • 或许他们不应该称之为 unlink 呢?
      猜你喜欢
      • 2012-05-20
      • 2022-01-23
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 2014-08-14
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多