2013-01-17 28 views
6

this question regarding Ruby類似,我想有條件地將參數傳遞給方法。目前,我有它配置如下:是否有可能將選項有條件地傳遞給perl中的方法?

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

我想是能夠有條件地和/或直到參數傳遞,根據以前的代碼。這不是語法正確的,但這樣的事情:

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

或本:

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

這是可能的,如果是這樣,我怎麼會去這樣做呢?

+1

這是什麼您正在尋找? http://stackoverflow.com/questions/8124138/how-to-pass-optional-parameters-to-a-perl-function – squiguy

回答

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), 
... 

但三元運算符表達對大多數人來說可能更容易閱讀。

+0

這是我這樣做的方式。 – friedo

+0

這樣做,謝謝!一個快速的谷歌和一些隨後的閱讀出現了「Logical Defined-Or」('//'),雖然與我原來的問題只有切線相關,但看起來非常有用。 –

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); 
相關問題