[英]Comparing multiple numerical values in Perl
假設我有一些變量, $x, $y, $z, $a, $b, $c
,並且我想確保它們都具有相同的值。
我可以用if ($x == $y == $z == $a == $b == $c)
以避免多次二進制比較,即( if $x == $y and $x == $z and $y == $z ...
)?
有什么辦法可以通過一個簡短的測試來完成所有比較?
if ( grep $x != $_, $y, $z, $a, $b, $c ) {
print "not all the same\n";
}
$x == $y and $x == $z and $y == $z
等效於$x == $y and $x == $z
因為相等性是可傳遞的。 后一個也是最佳解決方案,對N個變量進行N-1個比較。
如果有數組,可以使用List::MoreUtils
uniq
:
use List::MoreUtils qw(uniq);
my @arr1 = qw(foo foo foo foo foo foo);
my @arr2 = qw(foo BAR foo foo foo foo);
print "arr1: ", (uniq @arr1) == 1 ? "All same" : "Different" , "\n";
print "arr2: ", (uniq @arr2) == 1 ? "All same" : "Different" , "\n";
(如果您有多個變量且沒有數組,則可能值得考慮重寫代碼...)
您可以使用List :: MoreUtils :: first_index 。
#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw( first_index );
my ($x, $y, $z, $a, $b, $c) = (1) x 6;
if (are_all_same($x, $y, $z, $a, $b, $c)) {
print "They all have the same value\n";
}
$c = 3;
unless (are_all_same($x, $y, $z, $a, $b, $c)) {
print "At least one has a different value than the others\n";
}
sub are_all_same {
my $x = shift;
-1 == first_index { $x != $_ } @_;
}
當然,存在這樣一個問題:在一個很小的范圍內擁有這么多的變量是否合適(您是否患有Fortranitis?),以及是否應該首先使用哈希來避免此類問題。
您還可以將are_all_same
與大型數組配合使用,這將帶來最少的額外空間和時間損失。
如果它們都相同,那么特別是第一個必須等於所有其余的。 因此,建議使用List::Util::all
:
use List::Util 'all';
if( all { $x == $_ } $y, $z, $a, $b, $c ) {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.