Perl 将运算符作为参数变量

Perl 将运算符作为参数变量,perl,Perl,您好,我正在尝试创建一个只包含四个运算符的简单计算器+,-,/和*,由于某些原因,我的实现无法工作 我已经看到了几个有效的实现(包括一些最模糊的实现),但是我想知道的是,为什么下面的实现不起作用 #!/usr/bin/perl my $num1 = $ARGV[0]; my $num2 = $ARGV[2]; my $operator = $ARGV[1]; print "$operator \n"; if($operator == '-') { $num3 = $num1 - $n

您好,我正在尝试创建一个只包含四个运算符的简单计算器
+,-,/
*
,由于某些原因,我的实现无法工作

我已经看到了几个有效的实现(包括一些最模糊的实现),但是我想知道的是,为什么下面的实现不起作用

#!/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;
在你的情况下,第一个结果是

全局符号“$num3”需要在脚本第14行显式的包名(您是否忘记声明“my$num3”?)。
添加缺少的
my$num3
声明后,我们得到

参数“-”在脚本第13行的数字等式(=)中不是数字。
这是因为
=
运算符是数值相等的。它将两个操作数转换为一个数字,该数字(如果不启用警告)会自动给出无效字符串的
0
。这就是为什么
($operand=='-')
最终执行
0==0
,这当然是正确的

要比较字符串,需要使用
eq

if ($operand eq '-')
另见

/expr.pl 7*2
的问题在于
*
是一个通配符,shell将其扩展为当前目录中所有文件的列表。您的程序将被调用为
/expr.pl 7 03.bellpaper.doc expr.pl当前目录2中的任何其他文件

为了防止出现这种情况,您需要引用它,例如使用
/expr.pl 7'*'2
/expr.pl 7'*'2
/expr.pl 7\*2


其他说明:

  • $operand
    是错误的名称。是接线员。这两个数字是操作数
  • $ARGV[…]
    中的手动分配可以合并为一个列表分配:
    my(…)=@ARGV
  • 每个块中的
    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";
}

通常,当我做这类事情时,我会生成一个名为choice的整数变量,该变量被传递到方法中。在这个方法中,我会用if和else-if语句来解释这个论点。例如:0=+、1=-、2=/和3=*

然而,命令./expr.pl 7*2返回以下内容:03.bellpaper.doc,这是无法理解的

*
是一个shell glob。您的shell正在用当前目录中每个文件的名称替换
*
。程序的参数是
7
,然后是大量文件名,然后是
2
。这些文件名中的第一个由
print“$operand\n”
行打印,然后由于
$operand
与您要检查的任何内容都不匹配,因此不会发生任何其他情况


解决这个问题的方法就是在
*
周围加上引号,或者以命令行以外的其他方式进行输入。

1。为什么是整数?直接以字符串形式传递操作符同样有效,并且更易于调试/维护。2.这并不能解决OP的问题。如何将运算符转换为数字?您好,谢谢您的建议,我已经对程序的运行进行了必要的编辑-您知道为什么我只使用
*
运算符时会收到如此奇怪的输出吗?@DavideLorino您正在通过shell传递参数,
*
是shell中的特殊字符(特别是glob)。避免这种情况的最简单方法是在传递运算符时引用它们:
“*”
也许您应该提到使用分派表?@ikegami呃,我考虑过了,但我认为对于仍在尝试进行字符串比较的人来说,这可能是太多的高级概念。不要以使现有答案无效的方式编辑问题。另请参阅