是否可以有条件地将选项传递给perl中的方法?

时间:2013-01-17 18:32:05

标签: perl methods

this question regarding Ruby类似,我想有条件地将参数传递给方法。目前,我将其配置如下:

my $recs = $harvester->listAllRecords(
    metadataPrefix => 'marc21',
    metadataHandler => 'MARC::File::SAX',
    set => 'pd',
    from => $from,
    until => $until,
);

我想要的是能够有条件地传递from和/或until参数,具体取决于之前的代码。这在语法上不正确,但是像这样:

from => $from if ($from),
until => $until if ($until),

或者这个:

if ($from) {from => $from,}
if ($until) {until => $until,}

这是可能的,如果可以的话,我该怎么做呢?

2 个答案:

答案 0 :(得分:11)

您可以将三元?:运算符与列表操作数一起使用:

my $recs = $harvester->listAllRecords(
    metadataPrefix => 'marc21',
    metadataHandler => 'MARC::File::SAX',
    set => 'pd',

    $from ? (from => $from) : (),
    $until ? (until => $until) : (),
);

也许值得了解"conditional list include" pseudo-operator,在这种情况下可以像

一样工作
...
(from => $from) x !!$from,
(until => $until) x !!defined($until),
...

但对于大多数人来说,三元运算符表达式可能更容易阅读。

答案 1 :(得分:5)

另一个选项是构建args的列表(或哈希),然后调用方法:

my %args = (
    metadataPrefix => 'marc21',
    metadataHandler => 'MARC::File::SAX',
    set => 'pd',
);
$args{from} = $from if $from;
$args{until} = $until if $until;

my $recs = $harvester->listAllRecords(%args);