嗨,堆栈溢出,
我正在数组中找到一个恒定的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;
有什么方法可以使代码更好并简化代码? 请帮忙。预先感谢
答案 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秒以下。