Как передать переменную в качестве первого аргумента подпрограмме, только если она определена? - PullRequest
1 голос
/ 21 апреля 2011

Есть ли у кого-нибудь лучший (более короткий) способ написания следующей логики на 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 @_}

Ответы [ 5 ]

7 голосов
/ 21 апреля 2011
use 5.010;
foo( $bar // (), $a, $b, $c );
2 голосов
/ 21 апреля 2011

Вы ничего не сказали о том, что делают ваши фактические сабвуферы 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
}
2 голосов
/ 21 апреля 2011

Вы можете использовать grep:

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

Это отфильтрует любые неопределенные значения в списке аргументов.

1 голос
/ 21 апреля 2011
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);
}
0 голосов
/ 21 апреля 2011

Вы можете использовать массив для построения списка аргументов:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...