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