2014-11-18 24 views
6

Có cách nào dễ dàng so sánh hai mảng chuỗi trong Perl không?So sánh hai mảng một cách dễ dàng bằng Perl

@array1 = (value1, value2, value3...); 
@array2 = (value1, value3, value4...); 

tôi cần sự so sánh như dưới đây cho "N" Số các giá trị,

value1 eq value1 
value2 eq value3 
value3 eq value4 

Xin gợi ý cho tôi biết là có bất kỳ mô-đun để làm điều này?

Cảm ơn

Trả lời

7

Hmm ... một Modu le để so sánh mảng, bạn nói. Làm thế nào về Array::Compare?

use Array::Compare; 

my $compare = Array::Compare->new; 

my @array1 = (value1, value2, value3...); 
my @array2 = (value1, value3, value4...); 

if ($compare->compare(\@array1, \@array2) { 
    say "Arrays are the same"; 
} else { 
    say "Arrays are different"; 
} 

Nhưng bạn cũng có thể sử dụng toán tử đối sánh thông minh.

if (@array1 ~~ @array2) { 
    say "Arrays are the same"; 
} else { 
    say "Arrays are different"; 
} 
3

Perl đã có một số phụ tùng cho một giải pháp cho bất kỳ hoạt động danh sách.

Xem List::UtilList::MoreUtils.

my $arrays_are_equal 
    = !List::Util::pairfirst { $a ne $b }  # first case where $a != $b 
     List::MoreUtils::zip(@array1, @array2) 
    ; 

Đối với ứng dụng này, xem List::Util::pairfirstList::MoreUtils::zip

+1

Trong khi đoạn mã này có thể giải quyết các câu hỏi, [trong đó có một lời giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – msrd0

1

Nhiệm vụ này là đủ đơn giản rằng tôi sẽ không nhất thiết muốn sử dụng một mô-đun CPAN. Thay vào đó, tôi có thể viết chương trình con so sánh của riêng mình và đặt nó vào mô-đun tiện ích của riêng tôi. Đây là một thực hiện sẽ so sánh hai mảng chứa chuỗi và/hoặc số nguyên.

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @array1 = (1..10, 'string'); 
my @array2 = (1..10, 'string'); 

my $is_same = is_same(\@array1, \@array2); 

print "is_same: $is_same\n"; 

sub is_same { 
    my($array1, $array2) = @_; 

    # immediately return false if the two arrays are not the same length 
    return 0 if scalar(@$array1) != scalar(@$array2); 

    # turn off warning about comparing uninitialized (undef) string values 
    # (limited in scope to just this sub) 
    no warnings; 

    for (my $i = 0; $i <= $#$array1; $i++) { 
    if ($array1->[$i] ne $array2->[$i]) { 
     return 0; 
    } 
    } 

    return 1; 
} 
3

Bạn có thể so sánh kích thước của cả hai mảng (@a1 == @a2 trong bối cảnh vô hướng), và sau đó so sánh kích thước của @a1 mảng với kích thước của danh sách các chỉ số tương ứng với chuỗi bình đẳng trong cả hai mảng (grep $a1[$_] eq $a2[$_], 0..$#a1),

if (@a1 == @a2 and @a1 == grep $a1[$_] eq $a2[$_], 0..$#a1) { print "equal arrays\n" } 
phiên bản hướng

Nhiều hoạt động (không đi qua tất cả các yếu tố nếu không cần thiết),

use List::Util 'all'; 

if (@a1 == @a2 and all{ $a1[$_] eq $a2[$_] } 0..$#a1) { print "equal arrays\n" } 
+1

Tôi không thích giải pháp đầu tiên của bạn bởi vì nó so sánh mọi mục trong cả hai mảng nhưng bạn đã giải quyết vấn đề đó với giải pháp thứ hai của mình để câu trả lời này nhận được phiếu bầu của tôi là tốt nhất từ ​​trước tới nay. –

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