2

下一个更优雅的写法是什么?

sub depend {
    my($x,$y) = @_;
    die "only one allowed" if( defined($x) && defined($y) );
    die "one must be defined" unless ( defined($x) || defined($y) );
    if( defined($x) ) {
         $y = somefunc($x);
    } else {
         $x = somefunc($y);
    }
    return($x,$y);
 }

该函数应该只得到一个参数。如果定义了两个 = 错误,如果定义无 = 错误。并且未定义的参数是根据定义的参数计算的。

4

4 回答 4

10

使用xor,即“异或”:

sub depend {
    my ($x, $y) = @_;
    die "Exactly one must be defined.\n" unless defined $x xor defined $y;

    if (defined $x) {
         $y = somefunc($x);
    } else {
         $x = somefunc($y);
    }
    return($x, $y);
 }

更新:您也可以缩短潜艇的其余部分。而不是if部分,只是把

return ($x // somefunc($y), $y // somefunc($x));
于 2013-05-20T18:48:12.523 回答
1

我可能将子例程定义为采用两个参数,但将它们视为键值对。要使用评论中的宽度/高度示例:

sub depend {
    my $key = shift;
    my $value = shift;
    die "One parameter only" if @_;
    return ($value, calc_height($value)) if $key eq "width";
    return (calc_width($value), $value) if $key eq "height";
    die "Must specify either height or width, not $key";
}

my ($w1, $h1) = depend( width => 5 );
my ($w2, $h2) = depend( height => 10 );
my ($w3, $h3) = depend();  # ERROR Must specify either height or width
my ($w4, $h4) = depend( other=>3 );  # ERROR Must specify either height or width, not other
my ($w5, $h5) = depend( foo => bar, 7); # ERROR, One parameter only
于 2013-05-20T22:48:55.940 回答
0

试试这个:

sub f 
{
  my ($x, $y) = @_; 
  die "BOOM" if (defined $x ? 1 : 0) + 
                (defined $y ? 1 : 0) != 1;
}
于 2013-05-20T18:48:33.337 回答
-1

使用xor可能不直观,下面的解决方案可以很容易地扩展到更多输入参数,

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

    die "There should be only one!" if (grep defined, $x,$y) != 1;

    if( defined($x) ) {
         $y = somefunc($x);
    }
    else {
         $x = somefunc($y);
    }
    return($x,$y);
}
于 2013-05-20T19:00:42.300 回答