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编写以下逻辑吗? 现在看起来有点麻烦。。。我不想把过多的变量传递给任何一个子例程

#!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,你现在离你的复印编辑徽章又近了几步,你对做一件好事感觉很好:):很高兴知道这一点。是的,感觉很好。:-)