2013-01-21 27 views
6

Có cách nào tốt hơn để thực hiện việc này không? Tôi đang cố gắng để xây dựng 2 mảng dựa trên giá trị của một đại lượng vô hướng:Điều kiện đẩy tới 1 trong 2 mảng trong Perl

my (@x, @y); 
my $r = [$v1, $v2, $v3]; 
push @x, $r if $s eq 'YES'; 
push @y, $r if $s ne 'YES'; 

tôi đã cố gắng sử dụng:

push $s eq 'YES' ? @x : @y, $r; 

có và không có dấu ngoặc, nhưng không có đường đi.

Lỗi là:

Type of arg 1 to push must be array (not null operation) at comp_report.pl line 79, near "$r;" 
+0

Tôi nghĩ mã của bạn là đúng as_is. Tôi nghĩ rằng sử dụng toán tử * ternary * cho một thứ khác ngoài gán một biến là một thói quen xấu (những gì có thể được thực hiện với toán tử Perl * ternary * đôi khi không thể được sao chép bằng các ngôn ngữ khác để thực hiện nó) –

Trả lời

13

đẩy đòi hỏi tham số đầu tiên của nó là một mảng thực tế (ít nhất là trước khi perl 5.14 và trước đó - nó có thể đã thay đổi), không phải là một biểu hiện, vì vậy bạn cần phải:

push @{ $s eq 'YES' ? \@x : \@y}, $r; 

Bắt đầu từ 5.14, builtins như push experimentally can take arbitrary hard references, vì vậy công trình này:

push $s eq 'YES' ? \@x : \@y, $r; 
+0

+1 Chỉ vài giây trước cùng một câu trả lời [ở đây] (http://stackoverflow.com/a/14446203/1337398). :) – speakr

9
push @{ $s eq 'YES' ? \@x : \@y }, $r; 

push thực sự muốn lấy mảng làm đối số đầu tiên, nhưng bạn vẫn có thể chọn mục tiêu động bằng cách sử dụng tham chiếu.

1

giải pháp ưa thích của tôi sẽ là

if($s eq 'YES'){ 
    push @x, $r; 
else{ 
    push @y, $r; 
} 

Chỉ cần một điều phong cách. Sử dụng một biểu thức bậc ba như là đối số đầu tiên để đẩy trông lộn xộn với tôi, và tôi không nhớ những dòng phụ. Cá nhân tôi đoán!

+0

Nếu không quá sâu vào nó, việc kiểm soát "giá trị l" của bạn cũng như "giá trị r" của bạn là điều tôi mong đợi bằng ngôn ngữ động. Đó là một thành ngữ phổ biến trong Lisp, ví dụ. Tôi ngạc nhiên khi Perl chiến đấu với tôi về điều này, và thực sự muốn biết liệu điều đó có thể xảy ra hay không. – jeberle

Các vấn đề liên quan