假设我有一些变量,.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)
)?
有什么方法可以用一个简短的简单测试进行比较吗?
答案 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 ) {
...
}