是否存在类似于“0但是真实”的“未定义但真实”的值?

时间:2012-10-08 14:21:51

标签: perl

我正在编写一个搜索例程,其中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";
}

4 个答案:

答案 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;
  • 对undefined(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;
  • True,和undef(return (1, undef);
  • True,字符串(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;
  • True,undef作为参数($_[2] = undef; return 1;
  • 返回
  • True,字符串作为参数($_[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();