Perl 如何仅在定义了变量后将其作为第一个参数传递给子例程?
有人有更好(更短)的方式用Perl编写以下逻辑吗? 现在看起来有点麻烦。。。我不想把过多的变量传递给任何一个子例程Perl 如何仅在定义了变量后将其作为第一个参数传递给子例程?,perl,Perl,有人有更好(更短)的方式用Perl编写以下逻辑吗? 现在看起来有点麻烦。。。我不想把过多的变量传递给任何一个子例程 #!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); }
#!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 @_}
您可以使用:
这将过滤掉参数列表中所有未定义的值。您可以使用:
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);
}
这将过滤掉参数列表中任何未定义的值。您没有说明实际的foo1/2/3子函数的功能,因此这可能不适合您的情况,但我的第一个冲动是修改它们,以便它们在
未定义时忽略第一个参数。这将允许您简单地调用foo1($bar,$a,$b,$c)无需担心是否定义了$bar
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);
}
sub foo1 {
shift unless defined $_[0];
# ...do other stuff now that any leading undef has been removed
}
你还没有提到你的实际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
}
您可以使用数组来构建参数列表:
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);
}
您可以使用数组来构建参数列表:
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);
}
:请使用适合公共论坛的词语。我已经替换了:请使用适合公共论坛的词语。我已经替换了这个词。:谢谢你没有在你的回答中使用不合适的词(这是问题中出现的)++@艾伦:谢谢,在有礼貌的场合,我会尽量注意我的语言。OTOH,你现在离你的复印编辑徽章又近了几步,你对做一件好事感觉很好:):很高兴知道这一点。是的,感觉很好。:-:感谢您在回答中没有使用不恰当的词(问题中有)++@艾伦:谢谢,在有礼貌的场合,我会尽量注意我的语言。OTOH,你现在离你的复印编辑徽章又近了几步,你对做一件好事感觉很好:):很高兴知道这一点。是的,感觉很好。:-)