有没有人有更好(更短)的方式在Perl中编写以下逻辑? 似乎abit很麻烦,因为它现在......而且我不想将任何过多的变量传递给任何一个子程序......
#!perl
use Data::Dumper;
my $var = "ok";
my $bar = 1;
my ($a, $b, $c) = (1,2,3);
if ($var eq "ok") {
if (defined $bar) {
foo1($bar, $a);
}
else {
foo1($a);
}
}
elsif ($var eq "not_ok") {
if (defined $bar) {
foo2($bar, $a, $b);
}
else {
foo2($a, $b);
}
}
else {
if (defined $bar) {
foo3($bar, $a, $b, $c);
}
else {
foo3($a, $b, $c);
}
}
sub foo1 {print Dumper @_}
sub foo2 {print Dumper @_}
sub foo3 {print Dumper @_}
答案 0 :(得分:7)
use 5.010;
foo( $bar // (), $a, $b, $c );
答案 1 :(得分:2)
答案 2 :(得分:2)
你还没有说过你的实际foo1 / 2/3潜艇做了什么,所以这可能不适合你的情况,但我的第一个冲动就是修改它们,这样他们就会忽略第一个参数,如果是的话undef
。这样,您就可以简单地拨打foo1($bar, $a, $b, $c);
,而无需担心是否定义$bar
。
sub foo1 {
shift unless defined $_[0];
# ...do other stuff now that any leading undef has been removed
}
答案 3 :(得分:1)
if ($var eq "ok") {
foo1(defined $bar ? $bar : (), $a);
}
elsif ($var eq "not_ok") {
foo2(defined $bar ? $bar : (), $a, $b);
}
else {
foo3(defined $bar ? $bar : (), $a, $b, $c);
}
答案 4 :(得分:0)
您可以使用数组来构建参数列表:
my @args = ($a);
unshift(@args, $bar) if defined $bar;
if ($var eq "ok") {
foo1(@args);
}
elsif($var eq "not_ok") {
foo2(@args, $b);
}
else {
foo3(@args, $b, $c);
}