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呃,我考虑过了,但我认为对于仍在尝试进行字符串比较的人来说,这可能是太多的高级概念。不要以使现有答案无效的方式编辑问题。另请参阅