gpt4 book ai didi

Perl - 从 arrayref 中删除不需要的元素

转载 作者:行者123 更新时间:2023-12-02 05:46:17 27 4
gpt4 key购买 nike

我正在编写一个脚本来解析“pure-ftpwho -s”命令以获取当前传输的列表。但是,当用户断开与 FTP 的连接并重新连接并恢复传输时,该文件会出现两次。我想用 Perl 删除重影。解析后,arrayref 看起来像这样(使用 Data::Dumper 转储)

$VAR1 = [
{
'status' => 'DL',
'percent' => '20',
'speed' => '10',
'file' => 'somefile.txt',
'user' => 'user1',
'size' => '14648'
},
{
'status' => 'DL',
'percent' => '63',
'speed' => '11',
'file' => 'somefile.txt',
'user' => 'user1',
'size' => '14648'
},
{
'status' => 'DL',
'percent' => '16',
'speed' => '60',
'file' => 'somefile.txt',
'user' => 'user2',
'size' => '14648'
}
];

这里 user1 和 user2 正在下载同一个文件,但是 user1 出现了两次,因为第一个是“幽灵”。检查和删除我不需要的元素的最佳方法是什么(在本例中是 arrayref 的第一个元素)。要检查的条件是 - 如果"file"键和“用户”键相同,则删除包含较小值的“百分比”键的 hashref(如果它们相同,则删除除一个之外的所有键)。

最佳答案

如果原始 arrayref 中的顺序无关紧要,这应该有效:

my %users;
my @result;

for my $data (@$arrayref) {
push @{ $users{$data->{user}.$data->{file}} }, $data;
}

for my $value (values %users) {
my @data = sort { $a->{percent} <=> $b->{percent} } @$value;
push @result, $data[-1];
}

这绝对可以提高效率。

关于Perl - 从 arrayref 中删除不需要的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2386033/

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