如果语句不会在 perl 中捕获字符串
If statement won't catch a string in perl
我正在尝试让我的 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) {
尽管多次尝试捕获错误,但行仍未捕获。我试过打印程序看到的内容但无济于事。当我从 strict/warnings 输入 quit 时得到的响应是
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.
我查看了其他几篇关于此的帖子,但似乎没有任何内容是导致此问题的原因。我做错了什么?
chomp
命令删除尾随的换行符,但作用于变量本身,其return值是删除的字符数。所以通常情况下,只需要 chomp
一个变量或一个表达式一次。由于 perl 中有两种比较运算符,< <= == != >= >
用于数字,lt le eq ne ge gt
用于字符串,因此我们应该在执行比较之前确定我们有什么样的值,以避免触发警告。
如果 $guess
是正整数或 0,$guess =~ m|^\d+$|
语句 return 为真,通过检查 $guess
的字符串化版本是否仅由数字组成.
因为 rand
return 是一个小数 0 <= x < 1
那么 rand 25
将 return 一个数字
0 <= x < 25
所以 25
永远不会到达。 int
会将数字向下舍入为零,因此 int rand 25
将 return 是 (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
}
}
}
我正在尝试让我的 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) {
尽管多次尝试捕获错误,但行仍未捕获。我试过打印程序看到的内容但无济于事。当我从 strict/warnings 输入 quit 时得到的响应是
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.
我查看了其他几篇关于此的帖子,但似乎没有任何内容是导致此问题的原因。我做错了什么?
chomp
命令删除尾随的换行符,但作用于变量本身,其return值是删除的字符数。所以通常情况下,只需要 chomp
一个变量或一个表达式一次。由于 perl 中有两种比较运算符,< <= == != >= >
用于数字,lt le eq ne ge gt
用于字符串,因此我们应该在执行比较之前确定我们有什么样的值,以避免触发警告。
如果 $guess
是正整数或 0,$guess =~ m|^\d+$|
语句 return 为真,通过检查 $guess
的字符串化版本是否仅由数字组成.
因为 rand
return 是一个小数 0 <= x < 1
那么 rand 25
将 return 一个数字
0 <= x < 25
所以 25
永远不会到达。 int
会将数字向下舍入为零,因此 int rand 25
将 return 是 (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
}
}
}