【问题标题】:What's wrong with my perl script?我的 perl 脚本有什么问题?
【发布时间】:2011-08-11 00:58:50
【问题描述】:

下面是我的代码,基本上如果答案是“Y”,那么脚本会运行一条消息,如果它是别的东西,那么它就会关闭。

#! usr/bin/perl
print "Do you wish to run Program? [Y/N]:";
$answer = <>;
if($answer == "Y") {
 print "COOOL\n";
} else {
 system "exit"
}

【问题讨论】:

标签: perl if-statement


【解决方案1】:

如果你问的话,Perl 会准确地告诉你问题出在哪里。只需在代码中添加“使用警告”即可。

#!/usr/bin/perl
use warnings;

print "Do you wish to run Program? [Y/N]:";
$answer = <>;
if($answer == "Y") {
 print "COOOL\n";
} else {
 system "exit"
}

然后运行它,给出:

$ ./y
Do you wish to run Program? [Y/N]:Y
Argument "Y" isn't numeric in numeric eq (==) at ./y line 6, <> line 1.
Argument "Y\n" isn't numeric in numeric eq (==) at ./y line 6, <> line 1.
COOOL

如果你也添加“使用诊断”会更好。

$ ./y
Do you wish to run Program? [Y/N]:Y
Argument "Y" isn't numeric in numeric eq (==) at ./y line 7, <> line 1 (#1)
    (W numeric) The indicated string was fed as an argument to an operator
    that expected a numeric value instead.  If you're fortunate the message
    will identify which operator was so unfortunate.

Argument "Y\n" isn't numeric in numeric eq (==) at ./y line 7, <> line 1 (#1)
COOOL

如果您让 Perl 帮助您找出错误,那么在 Perl 中编程会容易得多。

【讨论】:

  • 为什么不建议use strict。在这种情况下无济于事,但在某些时候肯定会。
  • 我同意。它肯定会的。但我不想让事情变得过于复杂。小步骤:)
  • 我会在答案底部添加use strict作为注释,效果如下:您也应该use strict;,这将帮助您找到更多错误。
【解决方案2】:

删除换行符。 == 用于数值相等,字符串需要eq

chomp($answer);
if($answer eq "Y") {

【讨论】:

  • 我试过了,但现在发生了这种情况。 hey@ubuntu:~/Desktop$ perl msg.pl 你想运行程序吗? [Y/N]:hey@ubuntu:~/Desktop$
【解决方案3】:

当您想知道发生了什么时,请开始跟踪您的输入。确保它是您认为的那样:

#!/usr/bin/perl
use strict;
use warnings;

print "Do you wish to run Program? [Y/N]:";
$answer = <>;

print "Answer is [$answer]\n";

由于您将大括号放在变量周围,您会注意到任何额外的空格。你应该在$answer 看到额外的东西:

Answer is [Y
]

这是你需要做点什么来处理它的线索。

而且,strictwarnings 可以帮助您在问题出现之前发现问题。

【讨论】:

    【解决方案4】:

    使用 Term::Prompt 或 IO::Prompt 可能会更好。不要重新发明轮子:)

    use IO::Prompt;
    prompt -yn, 'Do you wish to run Program?' or exit;
    

    【讨论】:

    • 不,在学习的时候重新发明轮子。真的。如果你不自己做几次,你就永远学不会编程。 :)
    • 我同意,至少对于提示这样的小事。当然,您不希望有人重新实现 LWP 或 DBI 等的 XML 解析器。
    • 是的,我希望有人重新发明 LWP。我一直在使用Mojolicious 来处理我以前使用 LWP 的所有内容,而且它更易于使用和扩展。如果塞巴斯蒂安从未重新发明它,我就不会得到更好的东西。我希望有人能重新发明 XML 解析器。
    • @brian,很有趣,猜猜你让我到了那里,我从没想过在其既定目的之外使用 Mojolicious,我会看看
    • @bryan,对!但是你会发现 Mojolicious 非常有用,而且你不会在每次需要时都重写它。
    【解决方案5】:

    你有换行符,chomp $answer$answer eq "Y"

    【讨论】:

    • 我尝试了 chomp,但代码继续失败。 #! usr/bin/perl print "你想运行程序吗?[Y/N]:";咀嚼($答案); if($answer eq "Y") { print "COOOL\n"; } else { 系统“退出” }
    【解决方案6】:

    您正在使用数字 == 来比较您的字符串。

    您可能想使用“eq”:

    if($answer eq "Y") {
        print "COOOL\n";
    } else {
         system "exit"
    }
    

    正如其他人所建议的那样,您需要在最后删除换行符。使用chomp

    【讨论】:

    • @yi_H ha,是的,应该读作“肯定”。无论如何,对于这个例子。 Perl 很高兴允许您尝试使用 == 进行字符串比较,所以我认为它确实有它的用途(大概是引用相等)。
    • 不。 "x" == "y"。它只是试图将其解释为一个数字。 "0x" != "1y"
    • @yi_H 你从哪里得到“1y”?数字上下文中使用的所有文本字符串都尝试提取前导数字值,如果未找到 perl -E 'say("x" + 0)'perl -E 'say("5x" + 0),则默认为 0(注意添加零会强制数字上下文,就像 == 所做的那样)
    • @Joel:这是一个提取示例,maaan...在第一个示例中,字符串在数值上相等,而在第二个示例中它们不相等。
    • @yi_H,好的,我现在看到了,抱歉。你说的和我说的一样。
    【解决方案7】:

    除了 chomp/chop 和 eq vs ==,您还需要记住答案的大小写。您正在测试 UPPERCASE 'Y',我敢打赌您输入的是小写 'y' 并且它们不相等。我建议使用:

     if (($answer eq 'y') || ($answer eq 'Y')) {
    

    或使用uc

    【讨论】:

    • Perl 没有“toupper”。您正在考虑“uc”。
    • if ($answer =~ /y/i) { do stuff } 允许 yYyesYES 等。确实可能会有像 Yukon 这样的误报,但我只担心大型项目或如下建议使用 @ 987654330@等
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2014-06-29
    • 1970-01-01
    • 2012-12-24
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多