perl使用函数返回值,就像语句条件一样

时间:2014-07-24 21:29:04

标签: perl function if-statement

在Perl中是否可以使用函数的返回值作为“if”语句中的表达式?例如;在C我可以写

if (!myFunction()){
   printf("myFunction returned false.\n");
} else {
   printf("myFunction returned true\n");
}

但在perl中,我发现我必须经历痛苦......

$ret = myFunction();
if (!$ret){
    print "myFunction returned false.\n";
}

我知道我发布此消息后,有人会将我重定向到此问题的其他几个帖子。但是,显然,我找不到我要找的东西,或者我不会写这个! 所以请不要忘记“你有没有尝试过......”的消息!

这就是myFunction()的样子。

sub myFunction
{
    my ($run, $runTime) = @_;
    my ($code);

    eval {
        $SIG{ALRM} = sub {die "Operation Timed Out";};

        alarm($run_time);
        $EXIT_STR = `$run`; # Execute $run and save output in EXIT_STR
        $code = $?;         # Save cmd exit code.
        $EXIT_CODE = $code; # Set a global value (EXIT_CODE)
        alarm(0);
        return($code);
    };
    if ($@) {
        if ($@ =~ /Operation Timed Out/) { 
            print "Time out\n";
            return(10);
        }
    }
}

在每个人的反馈之后,我回到书中了解更多有关eval的信息。经过一些阅读后,“eval”更“清楚地”将一个值返回给它所属的函数。然后我决定如何处理eval结果。考虑到这一点,我做了一些改变,功能正如我所希望的那样工作。谢谢大家!

4 个答案:

答案 0 :(得分:1)

烨。

等待。我不能给出这么简短的答案......

是。如果函数在if语句中,Perl将把函数的返回值作为布尔值。如果返回值为零,空字符串,空值,空字符串或undef,则if语句将被视为false。否则,if语句将被视为true。

这是一个易于理解的例子:

if ( not is_odd( $number ) ) {
    print "$number is divisible by two\n";
}

sub is_odd {
    my $number = shift;
    return $number % 2;   # Modulo arithmetic
}

在上面$number % 2将在偶数上返回零,在奇数上返回一个。

这是一个很好的问题。最好的办法是编写一个小脚本来试用它。稍微玩一下:

例如。让我们添加一个我们可以使用的第二个函数:

sub is_even {
    my $number = shift;
    return not is_odd( $number );
}

这是什么回报?这在if语句中如何工作?

答案 1 :(得分:0)

这样可以正常工作。

唯一需要注意的是,在if语句中使用它会为返回值提供标量上下文,因此如果返回非标量的内容,它将在if条件被评估之前得到scalarized。

答案 2 :(得分:0)

如果您不希望函数返回True,则可能需要显式返回false值。请记住,perl函数将在没有实际返回值的情况下返回最后一个计算语句。所以,举个例子:

#!/usr/bin/perl

use warnings;
use strict;

my $x = 4;                                                                                                                            
my $y = 1;                                                                                                                            


if ( ! myFunction($x,$y) ) {
    print "myFunction returned false\n";
} else {
    print "myFunction returned true\n";
}

sub myFunction {
    my ($x,$y) = @_;
    my $response;

    if ( $x + $y == 2 ) {
        $response = "fun";
    } else {
        $response = "no fun";
    }
}

这将始终打印'myFunction返回true',因为条件的任何一个分支在技术上都是真正的响应。但是,如果将返回值添加到条件的负分支,它现在将起作用:

#!/usr/bin/perl

use warnings;
use strict;

my $x = 4;
my $y = 1;


if ( ! myFunction($x,$y) ) {
    print "myFunction returned false\n";
} else {
    print "myFunction returned true\n";
}

sub myFunction {
    my ($x,$y) = @_;
    my $response;

    if ( $x + $y == 2 ) {
        $response = "fun";
        return 1; # technically not really needed
    } else {
        $response = "no fun";
        return 0;
    }
}

$ perl test_funct.pl
myFunction returned false

答案 3 :(得分:0)

您正试图从return内部调用eval来查找您的子程序。这不会像您期望的那样执行,如return的文档中所述:

  
      
  • return EXPR
  •   
  • return

         

    使用EXPR中给出的值从子例程evaldo FILE返回。 ...

  •   

您可以在以下示例中演示您遇到的错误:

sub myFunction {
    eval {
        return "inside eval";
    };

    return "outside eval";
}

print myFunction();

输出:

outside eval

要修复子程序,请在eval中指定返回值,但实际上是从外部返回。此外,请务必本地化您的警报信号处理程序。

sub myFunction {
    my ($run, $runTime) = @_;

    my $code;

    eval {
        local $SIG{ALRM} = sub {die "Operation Timed Out";};
        alarm($run_time);
        $EXIT_STR = `$run`; # Execute $run and save output in EXIT_STR
        alarm(0);
        $code = $?;         # Save cmd exit code.
    };

    if ($@) {
        if ($@ =~ /Operation Timed Out/) { 
            print "Time out\n";
            $code = 10;
        }
    }

    return $code;
}