我正在编写一个搜索例程,其中undefined和zero都是有效结果。我正在返回一个像($result, $answer)
这样的双元素数组,因为我没有“未定义但真实”的值。它工作正常,但有点klutzy。一堂课似乎有点矫枉过正。
这样的事情是否存在或者可能以某种方式伪造?我正在考虑0E0
技巧等等。
更多细节。这是我想要的用户界面。当前例程返回两个值,结果(无论是否找到键)和值(如果是)。
my $result = search_struct($key, $complex_data_structure);
if ($result) {
print "A result was found for $key! Value is: ", $result // "Undefined!", "\n";
}
else {
print "Sorry, no result was found for $key.\n";
}
答案 0 :(得分:8)
您可以返回对结果的引用。返回undef
表示没有结果,\( undef )
表示文字未定义结果,\( whatever )
表示任何其他结果。然后调用者可以使用$$result
(在确定$result
之后)。
答案 1 :(得分:5)
不,但有很多方法可以让你回归三个州。
解决方案1
return;
)return undef;
)return "foo";
)
my $found = my ($result) = search_struct($key, $data);
if ($found) {
print "$key: ", $result // "Undefined!", "\n";
}
else {
print "Sorry, no result was found for $key.\n";
}
标量上下文中的列表赋值计算为右侧返回的元素数。
解决方案2
return undef;
)return \undef;
)return \"foo";
)
my $result = search_struct($key, $data);
if ($result) {
print "$key: ", $$result // "Undefined!", "\n"; # Note change here!
}
else {
print "Sorry, no result was found for $key.\n";
}
解决方案3
return 0;
)return (1, undef);
)return (1, "foo");
)
my ($found, $result) = search_struct($key, $data);
if ($found) {
print "$key: ", $result // "Undefined!", "\n";
}
else {
print "Sorry, no result was found for $key.\n";
}
解决方案4
return 0;
)$_[2] = undef; return 1;
)$_[2] = "foo"; return 1;
)
my $found = search_struct($key, $data, my $result);
if ($found) {
print "$key: ", $result // "Undefined!", "\n";
}
else {
print "Sorry, no result was found for $key.\n";
}
BTW,我会将数据结构作为第一个参数传递,将密钥作为第二个参数传递。更像是OO编程。
答案 2 :(得分:2)
您可以在列表(不是数组)中返回您的答案:找不到结果的空列表,否则为一个元素列表((undef,)
或($some_answer,)
)。
它仍然相当笨拙,但是:
if (my ($answer) = the_function()) { # note parentheses
process_answer($answer); # might be undef, false, etc.
} else {
no_results_found();
}
答案 3 :(得分:0)
“undefined”如何也“真实”?你为什么要这样的结构?难道你没有意识到,对于一个函数来返回输入上的 undefined ,这样的结果也不应该是“true”。
但是,从Perl 5.10开始,这里的谓词not-a-defined-false:
if ( possibly_undefined() // 1 ) {
}
但我认为零但真实的实际更适合查找功能。
my ( $value )
= map { $repos->get( $_ ) }
grep { $_ }
$repos->find( $lookup_criteria )
;
find
函数中的布尔值表示“我找到了吗?”索引代表问题“在什么指数?”。如果找不到索引,请返回''
或undef
。零但真实的意思是“我在第一个索引处找到它。”
但是,您始终可以使用您可能需要的任何布尔和整数解释创建类。下面的类定义了一个对象,可以在整数上下文中定义为整数,在测试数字是否为奇数时定义为false:
package Odd;
use strict;
use warnings;
use overload qw<bool boolean_result 0+ value fallback 1>;
sub new { return bless do { \( my $v = $_[1] ) }, $_[0]; }
sub boolean_result { return ${ $_[0] } % 2; }
sub value { return ${ $_[0] }; }
sub set_value { ${ $_[0] } = $_[1]; return $_[0]; }
package main;
use strict;
use warnings;
use Test::More;
my $odd = Odd->new( 1 );
is( $odd + 0, 1 );
is( !$odd, '' );
is( !!$odd, 1 );
my $even = Odd->new( 2 );
is( $even + 0, 2 );
is( !$even, 1 );
is( !!$even, '' );
done_testing();