我有一个数字列表
4
44个
4420
44208个
442082个
4420820个
44208202个
4420820205个
44208202057
442082020579
现在我有号码442082020987,如何才能获得正则表达式搜索以找到最接近的匹配?
44→2→0→8→2→0→2→0→5→7→9→给了我所有这些,有没有办法显示最接近的匹配?
感谢
答案 0 :(得分:3)
正则表达式确实是这项工作的错误工具 - 正则表达式是关于匹配模式的。你正在做的任务......不是。
尝试不同的方法,例如使用Text::Levenshtein
进行比较:
#!/usr/bin/env perl
use strict;
use warnings;
use Text::Levenshtein qw/ distance /;
my $search = '442082020987';
while ( <DATA> ) {
chomp;
print distance ( $search, $_ ), "=>", $_,"\n";
}
__DATA__
4
44
4420
44208
442082
4420820
44208202
4420820205
44208202057
442082020579
输出:
11=>4
10=>44
8=>4420
7=>44208
6=>442082
5=>4420820
4=>44208202
3=>4420820205
2=>44208202057
3=>442082020579
我会留给您选择最小值,假设:“2 => 44208202057
”是您的方案的正确答案。
或者您可以进行数字比较 - 但这些看起来像电话号码,因此基于字符串的匹配可能是合适的。
答案 1 :(得分:3)
我认为这是来自List::UtilsBy
模块
nmin_by
的情况
use strict;
use warnings 'all';
use feature 'say';
use List::UtilsBy 'nmin_by';
chomp( my @data = <DATA> );
my $target = 442082020987;
say nmin_by { abs($_ - $target) } @data;
__DATA__
4
44
4420
44208
442082
4420820
44208202
4420820205
44208202057
442082020579
442082020579
如果您希望避免使用该模块,那么这将完成工作。输出与第一个解决方案相同
for my $n ( @data ) {
my $delta = abs($n - $target);
unless ( defined $min_delta and $min_delta <= $delta ) {
($nearest, $min_delta) = ($n, $delta);
}
}
say $nearest;