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

问题描述 投票:1回答:3

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引用的数组并将其存储在一组标量中。

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

perl
3个回答
2
投票
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的智慧。


4
投票

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

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

有关详细信息,请参阅perlref


4
投票

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

while (my $line = <$log_fh>) {
    # ...
    $unique_import_hash{$log_import_filename} = $log_object_filename;
}
© www.soinside.com 2019 - 2024. All rights reserved.