2015-04-23 57 views
0

假设我有几个变量,$x, $y, $z, $a, $b, $c,我想确保它们都具有相同的值。在Perl中比较多个数值

我可以用类似if ($x == $y == $z == $a == $b == $c)的东西来测试,以避免多重二进制比较,即(if $x == $y and $x == $z and $y == $z ...)?

有没有什么办法可以用一个简短而简单的测试来做所有的比较?

+1

我想是的。试一试! –

+0

如果您有4个或更多变量,则二进制比较过多。 :)))对我来说太多了,至少。 – Stefan

+0

试了一下。多重比较不起作用。有人知道任何诡计吗? – Stefan

回答

7
if (grep $x != $_, $y, $z, $a, $b, $c) { 
    print "not all the same\n"; 
} 
+0

你只是打败了我这个解决方案:) – mttrb

4

$x == $y and $x == $z and $y == $z相当于$x == $y and $x == $z由于平等是可传递的。后者也是最佳解决方案,N个变量的N-1比较。

如果你有一个数组,你可以使用uniqList::MoreUtils

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"; 

(如果您有多个变量更多,没有一个数组,它可能是值得考虑重写代码。 ..)

3

您可以使用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与一个大阵列,它会施加最小的额外的空间和时间的惩罚。

+0

哇,奇妙的答案和评论。感谢Sinan Unur,Amadan和ysth。他的答案简洁明了,他得到了积分。 :) – Stefan

1

如果它们全都相同,那么特别是第一个必须等​​于所有剩下的。所以建议使用List::Util::all

use List::Util 'all'; 

if(all { $x == $_ } $y, $z, $a, $b, $c) { 
    ... 
}