假设我有几个变量,$x, $y, $z, $a, $b, $c
,我想确保它们都具有相同的值。在Perl中比较多个数值
我可以用类似if ($x == $y == $z == $a == $b == $c)
的东西来测试,以避免多重二进制比较,即(if $x == $y and $x == $z and $y == $z ...
)?
有没有什么办法可以用一个简短而简单的测试来做所有的比较?
假设我有几个变量,$x, $y, $z, $a, $b, $c
,我想确保它们都具有相同的值。在Perl中比较多个数值
我可以用类似if ($x == $y == $z == $a == $b == $c)
的东西来测试,以避免多重二进制比较,即(if $x == $y and $x == $z and $y == $z ...
)?
有没有什么办法可以用一个简短而简单的测试来做所有的比较?
$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";
(如果您有多个变量更多,没有一个数组,它可能是值得考虑重写代码。 ..)
您可以使用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
与一个大阵列,它会施加最小的额外的空间和时间的惩罚。
哇,奇妙的答案和评论。感谢Sinan Unur,Amadan和ysth。他的答案简洁明了,他得到了积分。 :) – Stefan
如果它们全都相同,那么特别是第一个必须等于所有剩下的。所以建议使用List::Util::all
:
use List::Util 'all';
if(all { $x == $_ } $y, $z, $a, $b, $c) {
...
}
我想是的。试一试! –
如果您有4个或更多变量,则二进制比较过多。 :)))对我来说太多了,至少。 – Stefan
试了一下。多重比较不起作用。有人知道任何诡计吗? – Stefan