Perl if then 语句遇到问题

问题描述 投票:0回答:3

我在使用 Perl 提出是/否问题时遇到了困难,我就是想不通。我对此有点菜鸟。

#! usr/bin/perl

print "Hello there!\n";
print "What is your favorite game?\n";
$name = <STDIN>;
chomp $name;
print "That's awesome! $name is my favorite game too!\n";

print "Do you think this is a fun script (Y/n) \n";
$status = <STDIN>;
if [ $status = "y" ]: then

print "YAY! I knew you would like it!\n";

if [ $status = "n" ]: then

print "You suck, not me!\n";

我做错了什么?

perl if-statement statements
3个回答
4
投票

if [
是一种 shell 语法。在 Perl 中,你应该使用

if (...) {

此外,

=
是赋值运算符。对于字符串相等,请使用
eq
:

if ($status eq 'y') {
    print "YAY\n";

在比较之前,您应该

chomp
$status 就像您已经在咀嚼 $name 一样。

另请注意,

Y
y
不相等。

此外,你的第一行(“shebang”)错过了起始斜杠:

#! /usr/bin/perl

2
投票
if [ $status = "y" ]: then

这(几乎)是 Bourne(或 bash)shell 语法(除了

:
应该是
;
)。等效的 Perl 代码是:

if ($status eq "y") {
    # ...
}

eq
是字符串的相等比较;
==
比较数字。

(您做错的另一件事是没有在问题中包含错误消息。)

例如:

$status = <STDIN>;
chomp $status;
if ($status eq "y") {
    print "YAY! I knew you would like it!\n";
}

您还可以采取其他一些措施来改进 Perl 代码。例如,您应该始终拥有:

use strict;
use warnings;

靠近源文件的顶部(这将需要声明变量,可能使用

my
)。我建议先让这个程序运行起来,然后再担心这个问题,但这绝对是您长期想要做的事情。


1
投票

首先,始终,始终将

use strict;
use warnings;
放在程序的顶部。这将捕获各种错误,例如在
=
语句中使用
if
=
设置变量的值。
==
测试数字相等性,
eq
测试字符串相等性。

这是您重写的程序。第一行带有

#!
在 PATH 中搜索可执行 Perl。这样,你就不用担心 Perl 是在
/usr/bin/perl
还是
/bin/perl
或者
/usr/local/bin/perl

#! /usr/bin/env  perl
use strict;
use warnings;
use feature qw(say);   # Allows the use of the "say" command

say "Hello there!";
print "What is your favorite game? ";
my $name = <STDIN>;
chomp $name;
say "That's awesome! $name is my favorite game too!";

print "Do you think this is a fun script (Y/n) \n";
my $status = <STDIN>;
chomp $status;
if ( $status eq "y" ) {
    say "Yay! I knew you would like it!";
}
elsif ( $status eq "n" ) {
    say "You suck, not me!";
}

更好的方法可能是检查输入是否以

y
开头:

if ( $status =~ /^y/i ) {   # Did it start with a 'y' or 'Y'?
    say "Yay! I knew you would like it!";
else {
    say "You suck, not me!";
}

注意使用

my
来声明变量。这是
use strict;
所需要的,并且会发现很多编程错误。请注意,
say
就像
print
,但我不必继续将
\n
放在末尾。

© www.soinside.com 2019 - 2024. All rights reserved.