【问题标题】:If statement won't catch a string in perl [duplicate]如果语句不会在 perl 中捕获字符串 [重复]
【发布时间】:2018-09-03 23:00:16
【问题描述】:

我试图让我的 if 语句捕捉到一个人输入的输入说退出或退出,但事实并非如此。这是我的代码

use strict;
use warnings;
my $g=0;
my $rn = int(rand(25));
until ($g == $rn) {
      $g = <STDIN>;
      if ($g == $rn) {
            print "You got it";
            } elsif (chomp($g) eq "quit" || chomp($g) eq "exit") {
            print "it triggered";
            } elsif ($g > $rn) { 
            print "incorrect its lower";
            } elsif ($g <$rn) {
            print "incorrect its higher";
            } else {
            print "end";
            }      
}
}

elsif (chomp($g) eq "quit" || chomp($g) eq "exit) {

尽管多次尝试捕获错误,但行未捕获。我试过打印程序看到的内容无济于事。当我从严格/警告中输入退出时,我得到的回应是

argument "quit\n" isn't numeric in numeric eq (==) at ./program24.pl line 30, <STDIN> line 1.
argument "quit" isn't numeric in numeric gt (>) at ./program24.pl line 36, line 1.

我查看了其他几篇关于此的帖子,但似乎没有任何内容是导致此问题的原因。我做错了什么?

【问题讨论】:

  • 1) chomp 不返回切碎的字符串;它修改了它的论点。 2)在数值比较之前做字符串比较。 3) 你不处理 EOF (!defined($g))。

标签: perl string-comparison


【解决方案1】:

chomp 命令删除尾随的换行符,但作用于变量本身,它的返回值是删除的字符数。因此,通常只需chomp 一个变量或一个表达式一次。由于 perl 中有两种比较运算符,&lt; &lt;= == != &gt;= &gt; 用于数字,lt le eq ne ge gt 用于字符串,所以我们应该在执行比较之前确定我们拥有什么样的值以避免触发警告。

如果$guess 是正整数或0,则$guess =~ m|^\d+$| 语句返回true,方法是检查$guess 的字符串化版本是否仅由数字组成。

由于rand 返回一个小数 0 &lt;= x &lt; 1 那么rand 25 将返回一个数字 0 &lt;= x &lt; 25 所以25 永远不会被联系到。 int 会将数字向下舍入为零,因此 int rand 25 将返回 (0,1,2,...,22,23,24) 之一。要获取(1,2,...,25),我们需要添加1

$g 这样的单字母变量通常不是一个好主意,因为它们不能传达变量的含义,并且如果它在代码中变得普遍,以后重命名会变得更加困难。我已将其替换为 $guess。在 perl 中,唯一普遍接受的单字母变量是 $a$b,它们是全局变量,用于比较函数,而 perl 预定义变量,如 $_$@ 等,记录在 perldoc perlvar

#!/usr/bin/perl

use strict;
use warnings;

my $guess = 0;
my $int_max = 25;
my $rn = int(rand($int_max)) + 1;

print "I have picked a number between 1 and $int_max, can you guess it?\n";
until ($guess == $rn) {
    chomp ($guess = <STDIN>);
    if ( $guess =~ m|^\d+$| ) {
        # Answer is an integer
        if ( $guess == $rn ) {
            print "You got it!\n";
        } elsif ( $guess > $rn ) {
            print "Too high, try again.\n";
        } elsif ( $guess < $rn ) {
            print "Too low, try again.\n";
        }
    } else {
        # Anything else
        if ('quit' eq $guess or 'exit' eq $guess) {
            print "Exiting...\n";
            exit 0;
        } else {
            print "Unclear answer : '$guess' : try again!\n";
            $guess = 0; # So the equality test does not warn
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2012-06-16
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2010-10-14
    • 2011-05-14
    相关资源
    最近更新 更多