将运算符作为参数变量

Dav*_*ino 0 perl

您好我想创建只有四家运营商一个简单的计算器+, -, /*出于某种原因,我的实现不工作。

我已经看到了几种可行的实现方式(包括一些值得混淆的地方),但是我很好奇的是,为什么以下各项无法实现?

#!/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";
}
Run Code Online (Sandbox Code Playgroud)

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

mel*_*ene 5

始终使用

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

在您的情况下,首先导致

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

添加缺少的my $num3声明后,我们得到

Global symbol "$num3" requires explicit package name (did you forget to declare "my $num3"?) at script line 14.
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为==运算符是数值相等的。它将两个操作数都转换为一个数字,该数字(如果未启用警告)将以静默方式给出0无效字符串。这就是为什么($operand == '-')最终会这样做0 == 0,这是正确的。

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

if ($operand eq '-')
Run Code Online (Sandbox Code Playgroud)

另请参阅关系运算符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./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";
}
Run Code Online (Sandbox Code Playgroud)