比较Perl中的多个数值

时间:2015-04-23 01:40:41

标签: perl

假设我有一些变量,.header { background-color: yellow; padding: 10px; } .menu { background-color: blue; float: left; width: 20%; } .content { background-color: red; float: left; width: 80%; } ,我想确保它们都具有相同的值。

我可以使用$x, $y, $z, $a, $b, $c之类的内容进行测试,以避免多次二进制比较,即(if ($x == $y == $z == $a == $b == $c))?

有什么方法可以用一个简短的简单测试进行比较吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

如果您有阵列,可以使用uniq中的List::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";

(如果你有多个变量并且没有数组,那么重写代码可能是值得考虑的......)

答案 2 :(得分: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?),以及是否应该首先使用哈希来避免这样的问题。 / p>

您还可以将are_all_same与大数组一起使用,并且会减少额外的空间和时间惩罚。

答案 3 :(得分:1)

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

use List::Util 'all';

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