Cả hai phương pháp trong bài chấp nhận cung cấp cho bạn câu trả lời sai nếu @test = (undef, '')
. Nghĩa là, họ khai báo một giá trị không xác định bằng với chuỗi rỗng.
Điều đó có thể chấp nhận được. Ngoài ra, việc sử dụng grep
đi qua tất cả các phần tử của mảng ngay cả khi không khớp được sớm và sử dụng hàm băm lớn hơn gấp đôi bộ nhớ được sử dụng bởi các phần tử của mảng. Không ai trong số này sẽ là một vấn đề nếu bạn có mảng nhỏ. Và, grep
có thể đủ nhanh cho các kích thước danh sách hợp lý.
Tuy nhiên, đây là một sự thay thế mà 1) trả về false cho (undef, '')
và (undef, 0)
, 2) không làm tăng bộ nhớ của chương trình của bạn và 3) ngắn mạch càng sớm càng không phù hợp được tìm thấy:
#!/usr/bin/perl
use strict; use warnings;
# Returns true for an empty array as there exist
# no elements of an empty set that are different
# than each other (see
# http://en.wikipedia.org/wiki/Vacuous_truth)
sub all_the_same {
my ($ref) = @_;
return 1 unless @$ref;
my $cmpv = \ $ref->[-1];
for my $i (0 .. $#$ref - 1) {
my $this = \ $ref->[$i];
return unless defined $$cmpv == defined $$this;
return if defined $$this
and ($$cmpv ne $$this);
}
return 1;
}
Tuy nhiên, sử dụng List::MoreUtils::first_index có khả năng là nhanh hơn:
use List::MoreUtils qw(first_index);
sub all_the_same {
my ($ref) = @_;
my $first = \ $ref->[0];
return -1 == first_index {
(defined $$first != defined)
or (defined and $_ ne $$first)
} @$ref;
}
Nguồn
2010-02-21 12:40:50
Chất lượng của giải pháp của bạn thực sự phụ thuộc vào những gì bạn đang làm ở chỗ vòng lặp foreach. Có, có rất nhiều cách để làm điều đó, nhưng tại sao bạn cảm thấy giải pháp hiện tại của bạn là thiếu? –
Tại sao bạn không mã hóa và đăng giải pháp "foreach" đó, vì vậy chúng tôi có thể nhận xét? – lexu
cho tất cả các áp phích liên quan về undef, tôi sẽ không giả định "kiểm tra xem mỗi phần tử của mảng có cùng chuỗi không" bao gồm khả năng undefs - một "chuỗi" theo định nghĩa :) được xác định. (mặc dù nó chắc chắn là một cái gì đó để xem xét) – ysth