在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结果。考虑到这一点,我做了一些改变,功能正如我所希望的那样工作。谢谢大家!
答案 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
的文档中所述:
您可以在以下示例中演示您遇到的错误:
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;
}