我试图找出一种方法来检查数组中值的存在,而不遍历数组。
我正在读取一个文件的参数。我有一长串不想处理的参数。我把这些不需要的参数放在一个数组@badparams中。
我想读取一个新的参数,如果它不存在于@badparams,处理它。如果@badparams中存在,请转到下一次读取。
我试图找出一种方法来检查数组中值的存在,而不遍历数组。
我正在读取一个文件的参数。我有一长串不想处理的参数。我把这些不需要的参数放在一个数组@badparams中。
我想读取一个新的参数,如果它不存在于@badparams,处理它。如果@badparams中存在,请转到下一次读取。
当前回答
简单地将数组转换为哈希:
my %params = map { $_ => 1 } @badparams;
if(exists($params{$someparam})) { ... }
你也可以添加更多(唯一的)参数到列表中:
$params{$newparam} = 1;
然后返回一个(唯一的)参数列表:
@badparams = keys %params;
其他回答
my @badparams = (1,2,5,7,'a','zzz');
my $badparams = join('|',@badparams); # '|' or any other character not present in params
foreach my $par (4,5,6,7,'a','z','zzz')
{
if ($badparams =~ /\b$par\b/)
{
print "$par is present\n";
}
else
{
print "$par is not present\n";
}
}
您可能需要检查数字前导空格的一致性
方法1:grep(可能小心,而值是一个正则表达式)。
如果查看资源,尽量避免使用grep。
if ( grep( /^$value$/, @badparams ) ) {
print "found";
}
方法二:线性搜索
for (@badparams) {
if ($_ eq $value) {
print "found";
last;
}
}
方法3:使用散列
my %hash = map {$_ => 1} @badparams;
print "found" if (exists $hash{$value});
方法四:smartmatch
(在Perl 5.10中添加,在Perl 5.18中标记为实验性)。
use experimental 'smartmatch'; # for perl 5.18
print "found" if ($value ~~ @badparams);
方法5:使用List::MoreUtils模块
use List::MoreUtils qw(any);
@badparams = (1,2,3);
$value = 1;
print "found" if any {$_ == $value} @badparams;
有两种方法。您可以使用将值扔到查找表的散列中,正如其他文章所建议的那样。(我再加一个成语。)
my %bad_param_lookup;
@bad_param_lookup{ @bad_params } = ( 1 ) x @bad_params;
但如果它的数据主要是单词字符,没有太多元,你可以把它转储到一个正则表达式的交替:
use English qw<$LIST_SEPARATOR>;
my $regex_str = do {
local $LIST_SEPARATOR = '|';
"(?:@bad_params)";
};
# $front_delim and $back_delim being any characters that come before and after.
my $regex = qr/$front_delim$regex_str$back_delim/;
这个解决方案必须针对您正在寻找的“坏值”类型进行调优。这对于某些类型的字符串来说可能是完全不合适的,买者自负。
这篇博文讨论了这个问题的最佳答案。
作为一个简短的总结,如果你可以安装CPAN模块,那么最有可读性的解决方案是:
any(@ingredients) eq 'flour';
or
@ingredients->contains('flour');
然而,更常见的习语是:
any { $_ eq 'flour' } @ingredients
但是请不要使用first()函数!它根本没有表达你代码的意图。不要使用~~“智能匹配”操作符:它已经坏了。不要使用grep()或带散列的解决方案:它们遍历整个列表。
Any()一旦找到你的值就会停止。
查看博客文章了解更多细节。
@files是一个已存在的数组
my @new_values = grep(/^2[\d].[\d][A-za-z]?/,@files);
print join("\n", @new_values);
print "\n";
/ ^ 2 \ [d]。[\ d] [A-za-z]吗?/ =从2开始的值这里可以放入任何正则表达式