6

与关于 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,}

这是可能的,如果是这样,我将如何去做?

4

2 回答 2

12

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

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

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

可能还值得了解“条件列表包含”伪运算符,在这种情况下,它的工作方式类似于

...
(from => $from) x !!$from,
(until => $until) x !!defined($until),
...

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

于 2013-01-17T18:37:58.583 回答
6

另一种选择是构建一个 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);
于 2013-01-17T19:02:50.303 回答