从perl中的函数获取返回布尔值

时间:2017-09-21 07:16:57

标签: perl

我从多个教程中听说没有布尔变量。相反,我可以使用1表示true,0表示false表示。但是,我有两种方法来获取布尔值。输出是相同的..但我不知道哪种方法对于收集返回布尔值是正确的。 让我给你举个例子 我创建了一个脚本,call.pl从另一个脚本script.pl调用该函数,script.pl将返回1或0.我执行if条件来评估。 如果这是真的,它会说它甚至是奇怪的。

方法1 script.pl

sub checkevenodd {
     my ($num) = @_;
     chomp($num);
     my $remainder = $num % 2;
     if ($remainder == 0)
     {
       return 1;
     }
     else
     {
        return 0
     }
}
1;

call.pl

require "script.pl";
my $no = 123;
if (checkevenodd($no) == 1)
{
    print "it is even";
}
else
{
   print "it is odd";
}

方法2 script.pl

sub checkevenodd {
     my ($num) = @_;
     chomp($num);
     my $remainder = $num % 2;
     if ($remainder == 0)
     {
       return 1;
     }
     else
     {
        return 0
     }
}
1;

call.pl

require "script.pl";
my $no = 123;
if (checkevenodd($no))
{
    print "it is even";
}
else
{
   print "it is odd";
}

我使用该函数来检查它是1还是0 ...然后如果它是1,它是偶数或奇数。 那么哪种方法最适合从函数中接收布尔值?我不想创建变量。相反,我想返回1或0 ..如何得到1或0 ..这是正确的方法??

2 个答案:

答案 0 :(得分:2)

当你写:

if (checkevenodd($no) == 1)

您没有检查布尔值。您正在检查值1.在这种情况下它将起作用(因为checkevenodd()只返回0或1)但是,通常,您应该只检查布尔表达式的真实性,而不是它的值。写作要好得多:

if (checkevenodd($no))

其他几点。

  • checkevenodd不是这个子程序的好名字。当我有子程序返回布尔值时,我总是尝试给它们一个以is_开头的名称。如果数字是偶数,则子例程返回true,因此我将调用此子例程is_even()
  • 您的子程序远比它需要的复杂得多。我会把它写成:

    sub is_even {
      my ($num) = @_;
    
      # For an even number, $num % 2 is zero - which is false.
      # Therefore use ! to make it true.
      return ! $num % 2;
    }
    

答案 1 :(得分:1)

这样的事情怎么样?

sub even_odd {
     my ($num) = @_;
     my $remainder = $num % 2;
     return $remainder ? 0 : 1;

}

并将其用作完整的脚本:

my $no = 123;
if (even_odd($no))
{
    print "it is even";
}
else
 {
   print "it is odd";
}

sub even_odd {
     my ($num) = @_;
     my $remainder = $num % 2;
     return $remainder ? 0 : 1;

}

返回:奇怪