2012-05-02 35 views
5

Tôi đang xây dựng một mảng băm của mảngThêm giá trị cho mảng nếu điều kiện được fullfilled

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => [ 
     {label => 'first inner hash'}, 
     {label => 'second inner hash'}, 
     ] 
    }, 
); 

Có cách nào để chỉ thêm băm bên trong chỉ đứng thứ hai nếu một điều kiện được fullfilled? Something như thế này:

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => [ 
     {label => 'first inner hash'}, 
     {label => 'second inner hash'} if 1==1, 
     ] 
    }, 
); 

tôi cố gắng viết lại mã của tôi sử dụng push:

my @innerarray =(); 
push @innerarray, {label => 'first inner hash'}; 
push @innerarray, {label => 'second inner hash'} if 1==1; 

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => \@innerarray 
    }, 
); 

Nhưng nó trở nên rất khó đọc, như tôi đã ấn định trước tất cả các mảng nội trước khi sử dụng chúng, mà trong một số trường hợp là một vài dòng mã trên mức sử dụng.

Có cách nào để thêm trực tiếp điều kiện nếu tôi chèn phần tử mảng không?

Trả lời

8

Sử dụng conditional operator, nó là có thể sử dụng như biểu.

my @array = (
    {label => 'first hash'}, 
    { 
     label  => 'second hash', 
     innerarray => [ 
      {label => 'first inner hash'}, 
      (1 == 1) 
       ? {label => 'second inner hash'} 
       :(), 
     ] 
    }, 
); 
+0

Cảm ơn, làm việc một cách chính xác làm thế nào tôi – Pit

+1

"Toán tử bậc ba" không phải là tên của nó, nó chỉ là một mô tả về số lượng toán hạng mà toán tử có điều kiện không phải là toán tử ternary duy nhất của Perl (ví dụ 'dbmopen') Cố định. – ikegami

6

Bạn đang lưu trữ tham chiếu mảng trong số innerarray của mình (ví dụ 1) nhưng trong phần viết lại, bạn cố lưu trữ mảng.
Hãy thử điều này thay vì:

my @innerarray =() ; 
push @innerarray, {label => 'first inner hash'}; 
push @innerarray, {label => 'second inner hash'} if 1==1; # Not a real condition ... 

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => \@innerarray 
    }, 
) ; 

Và bạn cũng bị mất tích một ; hai lần.

Và đối với câu hỏi của bạn về nội tuyến một số nội dung ...

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => [ 
     {label => 'first inner hash'}, 
     ($condition == 1 ? {label => 'second inner hash'} :()) , 
     ] 
    }, 
) ; 
+0

Bạn nói đúng, nhưng nó không giải quyết vấn đề ban đầu của tôi :( – Pit

+0

@Pit tôi cập nhật câu trả lời của tôi. Có một cái nhìn vào nó. – dgw

+1

Vâng, cùng một giải pháp như @daxim – Pit

2

Bạn có thể làm:

#!/usr/bin/env perl 

use strict; use warnings; 

my @array = (
    {label => 'first hash'}, 
    {label => 'second hash', 
    innerarray => [ 
     {label => 'first inner hash'}, 
     1 == 0 ? {label => 'second inner hash'} :(), 
     ] 
    }, 
); 

use YAML; 
print Dump \@array; 

Output:

--- 
- label: first hash 
- innerarray: 
    - label: first inner hash 
    label: second hash

Nhưng, tại sao ?

Bạn cũng có thể làm:

({label => 'second inner hash'}) x (1 == 0), 

nhưng, một lần nữa, tại sao ?

Cụ thể, nhúng điều này vào lúc khởi tạo cấu trúc dữ liệu sẽ ẩn giấu những gì đang xảy ra với người đọc mã. Nếu các điều kiện thậm chí còn hơi phức tạp, bạn bị ràng buộc để giới thiệu khó khăn để theo dõi lỗi.

2

Ngoài toán tử có điều kiện (và đôi khi kết hợp với nó), map thường hữu ích trong các trường hợp tương tự.

my @labels = (
    'first inner hash', 
    'second inner hash', 
); 

my @array = (
    {label => 'first hash'}, 
    { 
     label  => 'second hash', 
     innerarray => [ 
      (map { { label => $_ } } @labels), 
     ] 
    }, 
); 
Các vấn đề liên quan