在Perl常量数组中查找项目

时间:2019-07-07 18:38:44

标签: arrays perl constants

嗨,堆栈溢出,

我正在数组中找到一个恒定的allowed_value值。如果main_value等于allowed_value数组中的任何值,那么我正在打印消息“允许的值正确”。因此,我完成了以下代码。

use constant allowed_value => qw(value1 value2);

my $main_value = 'value2';

my @attr = (allowed_value);

print "Allowed value is correct" if grep $_ eq $main_value, @attr; 

有什么方法可以使代码更好并简化代码? 请帮忙。预先感谢

2 个答案:

答案 0 :(得分:4)

grep适用于小型集合,但每次都必须搜索整个集合。

对于较大的集合,您可以使用List::Util's any() function更快地完成此操作。与grep相比,它的优势在于,一旦匹配一次,它将停止搜索。假设数据是随机的,那么平均而言,您将搜索列表的一半。

use strict;
use warnings;
use v5.10;
use List::Util 'any';

use constant allowed_values => qw(value1 value2);
my $main_value = 'value3';

say "Good" if any { $_ eq $main_value } allowed_values;

但是,每次仍会搜索allowed_values的甚至一部分。对于较小的允许值集来说,这无关紧要,但是当它变大时,它会变慢。

代替use a hash as a set。设置工作要多一些,但无论设置多大,它都将更加方便并且执行相同的操作。

use strict;
use warnings;
use v5.10;

use constant allowed_values => {
    value1 => 1,  # any true value will do
    value2 => 1,
};
my $main_value = 'value2';

say "Good" if allowed_values->{$main_value};

如果允许的值列表很长,则可以从列表中生成哈希值,而无需进行大量输入。

use constant allowed_values => {
    map { $_ => 1 }
    qw(value1 value2)
};

缺点是“常量”引用并不是真正的常量。只有引用是常量,该引用的内容才能更改。

allowed_values->{foo} = 42;  # this is "fine"

如果这是一个问题,请改用Const::Fast

use strict;
use warnings;
use v5.10;

use Const::Fast qw(const);
const my %allowed_values => (
    map { $_ => 1 }
    qw(value1 value2)
);
my $main_value = 'value2';

say "Good" if $allowed_values{$main_value};

除非您真的需要内联常量,通常您不需要。

答案 1 :(得分:0)

根据文件的大小,我将使用if(存在)并将数组映射为哈希。一旦编写了一个包含很多问题的程序,我们花了40万行运行,而当我替换了大多数问题时,时间降到了20秒以下。