2013-01-17 18 views
6

Tương tự như this question regarding Ruby, tôi muốn điều kiện tham số theo phương thức. Hiện tại, tôi có cấu hình được cấu hình như sau:Có thể chuyển các tùy chọn thành một phương thức trong perl không?

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

Điều tôi muốn là có thể chuyển điều kiện từ và/hoặc cho đến khi tham số, tùy thuộc vào mã trước đó. Đây không phải là cú pháp chính xác, nhưng một cái gì đó như thế này:

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

hay này:

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

Đây có phải là có thể, và nếu như vậy, làm thế nào tôi sẽ đi về làm việc đó?

+1

Đây có phải là những gì bạn đang tìm kiếm? http://stackoverflow.com/questions/8124138/how-to-pass-optional-parameters-to-a-perl-function – squiguy

Trả lời

11

Bạn có thể sử dụng ?: hành ternary với toán hạng danh sách:

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

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

Nó cũng có thể có giá trị biết về "conditional list include" pseudo-operator, mà trong trường hợp này sẽ làm việc như

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

nhưng các nhà điều hành ternary biểu thức có lẽ dễ đọc hơn đối với hầu hết mọi người.

+0

Đây là cách tôi làm điều đó. – friedo

+0

Điều đó đã làm điều đó, cảm ơn! Google nhanh chóng và một số đọc sau đã bật lên "Logical Defined-Or" ('//'), trong khi chỉ liên quan đến câu hỏi ban đầu của tôi, xuất hiện rất hữu ích. –

5

Các tùy chọn khác là xây dựng một danh sách (hoặc băm) của args và sau đó gọi phương thức:

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); 
Các vấn đề liên quan