【问题标题】:Perl if not working?Perl 如果不工作?
【发布时间】:2011-06-21 12:20:35
【问题描述】:

这是我的代码:

#!/usr/bin/env perl

子开始
{
    ...
}

子站
{
    ...
}

如果(定义 $ARGV[0])
{
    if ($ARGV[0]=='start') {开始}
    elsif ($ARGV[0]=='stop') {停止}
    否则 {die “无法识别的命令:$ARGV[0]”}
}

不管我做什么,它总是执行&start。我做错了吗?

我正在使用 Linux Mint 10 和 Perl 5.10.1。

【问题讨论】:

    标签: perl comparison if-statement


    【解决方案1】:

    您正在使用数字比较来检查字符串是否相等,这会先将参数转换为数字,然后再进行比较。

    在这种情况下,'start' 不是数字,所以它被转换为0$ARGV[0] 中的值(这里应该是一个词)也被转换,导致另一个0if (0 == 0) 的最终条件,这总是正确的。

    您想改用eq 字符串比较运算符:

    if ($ARGV[0] eq 'start') { start }
    

    有关不同比较运算符的更多信息,请参阅docs

    请注意(正如 cmets 中所指出的),在脚本顶部包含 use warnings; 会导致 perl 从一开始就警告您。始终包含use warnings;use strict; 通常是最佳做法,因为它有助于及早发现此类错误。

    【讨论】:

    • 被视为数字,'start' 与 0 相同,其他大多数字符串也是如此。使用 use warnings; use strict; 会有所帮助。
    • 确实,打开严格和警告后,问题会立即弹出并显示相关警告消息。
    • 你应该补充一点,他的第一个条件实际上是if ( 0==0 ),这是不言自明的。
    • @Axeman:我会在我的回答中添加它,但乔纳森的评论不言自明
    • @Jonathan:+1。添加到您的评论:以数字开头的字符串(如'1234abc')将转换为该数字(1234),其他任何内容都将转换为0
    【解决方案2】:

    错误是您的程序忽略了以 the standard boilerplate 开头的 Perl 代码。

    【讨论】:

    • 这个错误首先是使用 Perl。我一直认为 Perl 是一种只写的语言。这个问题教会了我……
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2014-05-15
    • 2012-09-06
    • 2013-09-24
    相关资源
    最近更新 更多