gpt4 book ai didi

perl - 排序的子键比较功能

转载 作者:行者123 更新时间:2023-12-04 05:38:59 24 4
gpt4 key购买 nike

我需要一个可以与排序一起使用的 Perl 比较函数。

每个键都是一个文本字符串,具有任意数量的子键,由定界符(点、冒号、空格和斜线)分隔。有些子键是数字的,需要按数字排序。 key 格式和子 key 的数量各不相同。因此,比较必须处理一个比另一个长的键,并且必须处理子键在一个键中是数字但在另一个键中不是数字的情况(在这种情况下,文本比较适合该子键)。

这有效,但我敢打赌有更好的解决方案:

use warnings;
use strict;
use Scalar::Util qw[looks_like_number];

sub hier_cmp {

my $aa = $a;
my $bb = $b;

# convert all delims (. : / space) to the same delim

$aa =~ tr/.:\/ /::::/;
$bb =~ tr/.:\/ /::::/;
my @lista = split(":", $aa);
my @listb = split(":", $bb);

my $result;

for my $ix (0 .. min($#lista, $#listb)) {
if (exists($lista[$ix]) && exists($listb[$ix])) {
if ( looks_like_number($lista[$ix]) && looks_like_number($listb[$ix])) {
# compare numerically
$result = ($lista[$ix] <=> $listb[$ix]);
} else {
# compare as strings
$result = ($lista[$ix] cmp $listb[$ix]);
}
if ($result == 0) {
next;
}
return $result;

} elsif (exists($lista[$ix])) {
return 1;
} else {
return -1;
}
}
}

就我而言,可读性比速度更重要。这仅适用于内部工具,列表很少有超过数百个元素。然而,任何学习东西的机会都是好的。

如您所见,我不是 perl 向导。即使对我的代码进行微不足道的改进,我们也将不胜感激。

谢谢!

最佳答案

如果你给我们一些数据来测试会有所帮助,但这段代码通过了一些基本的测试,看起来是正确的。

它通过使用 List::MoreUtils 简化了问题功能 pairwise创建一个字段对数组。

然后只是检查是否只定义了一个,当一个列表在另一个列表之前结束并且应该首先排序时;如果它们都是数字,何时应该与数字比较进行比较;或者简单地将它们作为字符串进行比较。

如果到达对数组的末尾,则所有内容都已匹配,并返回零以表示相等。

更新

我已更改此代码以删除对 List::MoreUtils::pairwise 的依赖.

use strict;
use warnings;

use Scalar::Util 'looks_like_number';

sub hier_cmp {

our ($a, $b);

my @a = split m|[.: /]+|, $a;
my @b = split m|[.: /]+|, $b;

for my $i (0 .. $#a > $#b ? $#a : $#b) {
my @ab = ( $a[$i], $b[$i] );
if (grep defined, @ab < 2) {
return defined $ab[0] ? 1 : -1;
}
else {
my $numeric = grep(looks_like_number($_), @ab) == 2;
my $result = $numeric ? $ab[0] <=> $ab[1] : $ab[0] cmp $ab[1];
return $result if $result;
}
}

return 0;
}

关于perl - 排序的子键比较功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11528619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com