簡體   English   中英

比較Perl中的多個數值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM