2013-04-15 47 views
6

tôi đã sử dụngPerl cách lặp lại hơn 2 mảng song song

Use List::MoreUtils qw(each_array); 
my $it = each_array(@input_dump_arr, @created_dump_arr); 
while (my ($first, $second) = $it->()) { 
} 

công việc này trong một cấu hình mặc định perl Sẽ? Một câu hỏi rộng hơn là có hướng dẫn để viết kịch bản "di động" perl không? Tôi mới để Perl, chỉ cần cố gắng tìm ra nếu cpan là thực sự tương tự như làm thế nào tăng thư viện là c + +.

Trả lời

4

Bạn có thể muốn sử dụng hàm viết lại đơn giản này của hàm each_arrayref của mô-đun. each_array là một trình bao bọc thừa xung quanh hàm này sử dụng các nguyên mẫu để tham chiếu đến các mảng được truyền dưới dạng tham số.

Chức năng của nó giống hệt với phiên bản mô-đun, ngoại trừ việc nó không kiểm tra các tham số nhận được, và trình trả về không kiểm tra xem nó có tham số hoặc 'index' hay không.

use strict; 
use warnings; 

sub each_array { 

    my @copy = @_; 
    my $i; 
    my $max; 

    for (map scalar @$_, @copy) { 
    $max = $_ unless defined $max and $max > $_; 
    } 

    sub { 
    return $i if @_ and shift eq 'index'; 
    my $new_i = defined $i ? $i + 1 : 0; 
    return if $new_i >= $max; 
    $i = $new_i; 
    return map $_->[$i], @copy; 
    } 
} 

my @array1 = qw/ A B C /; 
my @array2 = qw/ D E F G /; 

my $iter = each_array(\@array1, \@array2); 

while (my @values = $iter->()) { 
    printf "%d: %s\n", $iter->('index'), join ', ', map $_ // 'undef', @values; 
} 

đầu ra

0: A, D 
1: B, E 
2: C, F 
3: undef, G 

Bạn có thể, tất nhiên, chỉ cần lấy mã cho each_arrayref từ các module List::MoreUtils. Nó là khép kín và sẽ đảm bảo khả năng tương thích với mã hiện tại của bạn.

2

Có các mô-đun được phân phối trực tiếp với chính Perl. Chúng thường được gọi là "mô-đun lõi". Bạn luôn có thể sử dụng chúng. List::Util là một trong số chúng, mặc dù List::MoreUtils thì không.

Tuy nhiên, List::MoreUtils là một mô-đun có sẵn trên CPAN. CPAN thường được coi là "thư viện chuẩn của Perl", tương tự như "Thư viện chuẩn" dành cho C++. Hầu hết mọi người nghĩ rằng nó là OK để yêu cầu người dùng ứng dụng của họ để có một số mô-đun cài đặt từ CPAN, đặc biệt là nếu họ đang sử dụng mô-đun.

List::MoreUtils chắc chắn là mô-đun được sử dụng tốt. Nó đã được khoảng một thời gian khá. Tất cả các bản phân phối Linux chính mà tôi biết có chứa các phiên bản đóng gói của nó.

Vì vậy, nếu mục tiêu của bạn không phải là 100% độc lập với các mô-đun không phải cốt lõi thì tôi khuyên bạn nên tiếp tục sử dụng List::MoreUtils và hầu hết các mô-đun tốt khác có sẵn trên CPAN. Đó là lý do tại sao đá Perl.

Hơi ngoại cảm: Tôi phải thừa nhận rằng tôi thích pairwise (cũng từ List::MoreUtils) cho chính xác hai mảng vì nó hoạt động giống như map. Ví dụ:

use List::MoreUtils qw(pairwise); 
pairwise { do_stuff($a, $b) } @input_dump_arr, @created_dump_arr; 
+2

Và nếu bạn không muốn yêu cầu 'Danh sách :: MoreUtils', bạn vẫn có thể [sao chép các phần bạn thích] (http://cpansearch.perl.org/src/RURBAN/List-MoreUtils-0.33 _007/lib/List/MoreUtils.pm) vào ứng dụng của bạn. – mob

+0

Cảm ơn đám đông, Perl đang phát triển với tôi: D – subramanian

+1

... nếu mã của bạn được phân phối bằng giấy phép tương thích. – ikegami

5

Đây không phải là mô-đun lõi (có nghĩa là nó không đi kèm với perl), nhưng đó là một mô-đun tương đối phổ biến. Tôi sẽ không ngần ngại sử dụng nó.

Nếu bạn đang thực sự hoang tưởng nó có thể không có sẵn, các mảng giả định là cùng kích thước, bạn có thể sử dụng giống như sau:

for my $i (0 .. $#array1) { 
    my $first = $array1[$i]; 
    my $second = $array2[$i]; 
} 

Tuy nhiên, may mắn thay each_array() được thực hiện trong tinh khiết perl, vì vậy bạn cũng có thể xem nguồn của List/MoreUtils.pm và sao chép và dán các chương trình con có liên quan.

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