gpt4 book ai didi

perl - 在保留顺序的同时按值长度对哈希进行排序

转载 作者:行者123 更新时间:2023-12-05 01:35:29 26 4
gpt4 key购买 nike

我目前正在编写一个 Perl 脚本来对来自 stdin 的行进行排序,并按行长度的顺序打印行,同时保留相等行的顺序。我的排序代码包括以下内容:

while (my $curr_line = <STDIN>) {
chomp($curr_line);
$lines{$curr_line} = length $curr_line;
}

for my $line (sort{ $lines{$a} <=> $lines{$b} } keys %lines){
print $line, "\n";
}

例如我的标准输入包含以下内容:

tiny line
medium line
big line
huge line
rand line
megahugegigantic line

我会得到以下输出:

big line
rand line
tiny line
huge line
medium line
megahugegigantic line

有什么方法可以保留等长行的顺序,使得 tiny 排在 huge 之前,而 huge 排在 rand 之前?此外,每次运行脚本时,顺序似乎都会改变。

提前致谢

最佳答案

一种可能的解决方案

您可以保存行在输入文件句柄中的位置以及长度$. magic variable (input line number)提供这个。然后您可以对这两个值进行排序。

use strict;
use warnings;

my %lines;
while ( my $curr_line = <DATA> ) {
chomp($curr_line);
$lines{$curr_line} = [ length $curr_line, $. ];
}

for my $line (
sort {
$lines{$a}->[0] <=> $lines{$b}->[0]
|| $lines{$a}->[1] <=> $lines{$b}->[1]
} keys %lines
) {
print $line, "\n";
}

__DATA__
tiny lin1
medium line
big line
huge lin2
rand lin3
megahugegigantic line

这将始终输出

big line
tiny lin1
huge lin2
rand lin3
medium line
megahugegigantic line

当然,您也可以使用散列来提高代码的可读性。

$lines{$curr_line} = { 
length => length $curr_line,
position => $.,
};

实现说明

由于随机哈希排序,您的结果每次都会更改顺序。 keys 返回键列表的方式是随机的,因为 Perl 实现散列的方式。这是设计使然,也是一项安全功能。由于有多个具有相同值的键,排序有时会返回不同的结果,具体取决于哪个等值键先出现。

您可以通过在 keys 调用前添加另一个 sort 来缓解这种情况。这将按名称对键进行排序,至少使不需要的结果的顺序保持一致。

#                                               vvvv
for my $line (sort{ $lines{$a} <=> $lines{$b} } sort keys %lines) { ... }

请注意,您不必 chomp如果在 print 时将 \n 放回原位,则输入。无论如何,它的长度总是相同的。如果这样做,您应该打印 $/,即input record separator chomp 已删除,或者您伪造了数据。

关于perl - 在保留顺序的同时按值长度对哈希进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52366644/

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