我正在学习Perl并遇到过这个问题
编写一个读取两个数字的Perl程序并执行以下操作: 它打印错误:如果第二个数字为0,则不能除以零。
如果我输入第二个数字为零,我收到错误
Illegal division by zero at ./divide.pl line 13, <STDIN> line 2.
我使用以下代码
#!/usr/bin/perl
## Divide by zero program
print("Enter the first number: \n");
$input1 = <STDIN>;
chomp ($input);
print ("Enter the second number: \n");
$input2 = <STDIN>;
chomp ($input2);
$answer = $input1/$input2;
if ($input2 == 0)
{
print("Error: can't divide by zero \n");
}
print("The answer is $answer \n");
答案 0 :(得分:6)
在进行分割之前,您需要执行检查。如果检查结果为真,您还需要完全跳过除法。
if ($input2 == 0) {
print("Error: can't divide by zero\n");
} else {
my $answer = $input1/$input2;
print("The answer is $answer\n");
}
顺便说一句,总是在你的程序中使用use strict; use warnings qw( all );
。
答案 1 :(得分:4)
从思南的评论中被盗(因为有时候我们会忘记我们所知道的事情并不为人所知):因为Perl 5(以及许多其他语言)并没有这样做,所以你会看到这条消息。处理division by zero。解释器尝试在没有安全措施的情况下执行此操作,并且放弃了die
。你的程序立即停止。你永远不会把它交给你检查。
编程的大多数练习是在获得输入时检查输入。而不是稍后检查,一旦收到它们就验证它们。您还可以检查两个输入实际上是否为数字。 Scalar::Util附带Perl,并有一个looks_like_number
子例程,可以为您执行此操作:
use Scalar::Util qw(looks_like_number);
print("Enter the first number: ");
chomp( my $numerator = <STDIN> );
die "$numerator doesn't look like a number!\n"
unless looks_like_number($numerator);
print ("Enter the second number: ");
chomp( my $denominator = <STDIN> );
die "$denominator doesn't look like a number!\n"
unless looks_like_number($denominator);
die "Can't divide by zero!\n" if $denominator == 0;
my $answer = $numerator/$denominator;
print "$numerator / $denominator = $answer\n";
做了一点,然后你开始意识到自己已经重复了一遍。您可以将其移动到子例程。一旦抽象出来,您可以调整get_number
进行任何类型的验证:
use Scalar::Util qw(looks_like_number);
my $numerator = get_number();
my $denominator = get_number();
die "Can't divide by zero!\n" if $denominator == 0;
my $answer = $numerator/$denominator;
print "$numerator / $denominator = $answer\n";
sub get_number {
print("Enter a number: ");
chomp( my $number = <STDIN> );
die "$number doesn't look like a number!\n"
unless looks_like_number($number);
return $number;
}
并且,我希望将换行符从提示中删除,以便在消息后输入我的输入:
$ perl zero.pl
Enter a number: 4
Enter a number: 5
4 / 5 = 0.8
$ perl zero.pl
Enter a number: Llama
Llama doesn't look like a number!