如果定义了变量,如何将变量作为第一个参数传递给子程序?

时间:2011-04-21 04:11:26

标签: perl

有没有人有更好(更短)的方式在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 @_}

5 个答案:

答案 0 :(得分:7)

use 5.010;
foo( $bar // (), $a, $b, $c );

答案 1 :(得分:2)

您可以使用grep

foo(grep { defined } $where, $is, $pancakes, $house);

这将过滤掉参数列表中的任何未定义值。

答案 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);
}