找到重复的文件名并将它们附加到数组的哈希值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到重复的文件名并将它们附加到数组的哈希值相关的知识,希望对你有一定的参考价值。

Perl问题:我有一个冒号分隔的文件,其中包含我正在使用的路径。我只是使用正则表达式进行拆分,如下所示:

my %unique_import_hash;

while (my $line = <$log_fh>) {
    my ($log_type, $log_import_filename, $log_object_filename) 
        = split /:/, line;

    $log_type =~ s/^s+|s+$//g; # trim whitespace
    $log_import_filename =~ s/^s+|s+$//g; # trim whitespace
    $log_object_filename =~ s/^s+|s+$//g; # trim whitespace
}

确切的文件格式是:

type : source-filename : import-filename

我想要的是一个索引文件,其中包含每个唯一键$log_object_filename的最后推送的$log_import_filename,因此,我要用英语/ Perl伪代码执行的操作是将$log_object_filename推送到由散列%unique_import_hash索引的数组上。然后,我想迭代键并弹出%unique_import_hash引用的数组并将其存储在一组标量中。

我的具体问题是:附加到数组的语法是什么?

答案
use strict;
use warnings;
my %unique_import_hash;

my $log_filename = "file.log";
open(my $log_fh, "<" . $log_filename);

while (my $line = <$log_fh>) {
    $line =~ s/ *: */:/g;
    (my $log_type, my $log_import_filename, my $log_object_filename) = split /:/, $line;
    push (@{$unique_import_hash{$log_import_filename}}, $log_object_filename);
}

寻求Perl monks的智慧。

另一答案

您可以使用push,但必须取消引用哈希值引用的数组:

push @{ $hash{$key} }, $filename;

有关详细信息,请参阅perlref

另一答案

如果您只关心每个键的最后一个值,那么您就会过度思考问题。当简单赋值将覆盖以前的值时,无需使用数组:

while (my $line = <$log_fh>) {
    # ...
    $unique_import_hash{$log_import_filename} = $log_object_filename;
}

以上是关于找到重复的文件名并将它们附加到数组的哈希值的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组附加为哈希值

如何在对象数组中获取 1 到 n 键值并将它们推送到新数组?(Javascript)[重复]

遍历目录树并将日期戳附加到文件名

表达式解析为未使用的 i 值 [重复]

如何附加到powershell Hashtable值?

提取numpy数组中所有1序列的第一个和最后一个索引并将它们附加到列表中?