您好我想创建只有四家运营商一个简单的计算器+, -, /
和*
出于某种原因,我的实现不工作。
我见过几个工作实施方案(包括一些应得最模糊的一个奖项),但是我很好奇,想知道是为什么不下面的工作?
#!/usr/bin/perl
my $num1 = $ARGV[0];
my $num2 = $ARGV[2];
my $operator = $ARGV[1];
print "$operator \n";
if($operator == '-')
{
$num3 = $num1 - $num2;
print "$num1 - $num2 = $num3\n";
}
elsif($operator == "+")
{
$num3 = $num1 + $num2;
print "$num1 + $num2 = $num3\n";
}
elsif($operator == "/")
{
$num3 = $num1 / $num2;
print "$num1 / $num2 = $num3\n";
}
elsif($operator == "*")
{
$num3 = $num1 * $num2;
print "$num1 * $num2 = $num3\n";
}
此外,该命令./expr.pl 7 * 2
返回以下内容:03.bellpaper.doc
这是深不可测的。
始终以
use strict;
use warnings;
在你的情况下,首先导致
Global symbol "$num3" requires explicit package name (did you forget to declare "my $num3"?) at script line 14.
添加缺失的my $num3
声明后,我们得到
Argument "-" isn't numeric in numeric eq (==) at script line 13.
发生这种情况是因为==
运算符是数字相等。它将两个操作数都转换为一个数字,该数字(如果您不启用警告)会默默地0
为无效字符串提供。这就是为什么($operand == '-')
最终会这样做0 == 0
,这当然是正确的。
要比较字符串,您需要使用eq
:
if ($operand eq '-')
另请参阅关系运算符在perldoc perlop
。
问题./expr.pl 7 * 2
在于这*
是一个通配符,您的 shell 将其扩展为当前目录中所有文件的列表。您的程序将被调用为./expr.pl 7 03.bellpaper.doc expr.pl whatever-else-is-in-the-current-directory 2
.
为了防止这种情况,您需要引用它,例如使用./expr.pl 7 '*' 2
or./expr.pl 7 "*" 2
或./expr.pl 7 \* 2
。
其他注意事项:
$operand
是错误的名字。是运营商。这两个数字是操作数。$ARGV[...]
可以合并为一个列表分配:my (...) = @ARGV;
print
每个块中的语句几乎相同。我们可以将它们拉出print "$num1 $operator $num2 = $num3\n"
(在确保$num3
实际设置之后)。这给了我们:
#!/usr/bin/perl
use strict;
use warnings;
my ($num1, $operator, $num2) = @ARGV;
print "$operator\n";
my $num3;
if ($operator eq '-') {
$num3 = $num1 - $num2;
} elsif ($operator eq '+') {
$num3 = $num1 + $num2;
} elsif ($operator eq '/') {
$num3 = $num1 / $num2;
} elsif ($operator eq '*') {
$num3 = $num1 * $num2;
}
if (defined $num3) {
print "$num1 $operator $num2 = $num3\n";
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句