Perl分部计划

时间:2018-03-31 17:17:12

标签: perl

我正在学习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");

2 个答案:

答案 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!