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

时间:2018-04-21 23:03:23

标签: perl

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

/**
 * All of your logic to get the messages
 */

$message = [
    'title' => 'This is basically the same thing as the W3 Schools link.',
    'body' => 'After JSON Encoding this array, and echoing it out it will be sent to your XHR requests onreadystatechange function'
];

// Its important that the call to header goes before ANY output.
// otherwise it will bomb.
header("Content-Type: application/json;");
echo json_encode($message);

确切的文件格式为:

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,因此,我将要用英语/ Perl伪代码执行的操作是推送{ {1}}到由哈希$log_import_filename索引的数组上。然后,我想迭代键并弹出$log_object_filename引用的数组并将其存储在一组标量中。

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

3 个答案:

答案 0 :(得分:4)

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

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

有关详细信息,请参阅perlref

答案 1 :(得分:4)

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

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

答案 2 :(得分: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的智慧。