为什么 perl 散列会覆盖以前的数据?

Why is the perl hash overwriting previous data?

所以,我正在将数据写入我的哈希 %errordata。看起来像这样

sub openfile
{
 if (open my $data, "<", $filename)
   {
    my $line = <$data>;
    print "Error: $line";
    my $dir = cwd;
    print "$dir\n";
    $errordata{$line} = $dir;
    while (my($keys,$values) = each %errordata) {
     print "$keys in $values\n";
    }
}

我得到的前两个打印输出看起来像这样

FIRST 
ERROR: quick brown fox
/abc/efg/hij/klm
SECOND
ERROR: quick brown fox
/abc/efg/hij/gvb

但是每次遇到相同的输出都会覆盖它,但我想保存路径,因为它可能不同。

FIRST 
quick brown fox in /abc/efg/hij/klm
SECOND
quick brown fox in /abc/efg/hij/klm

我应该使用 push (@{%hash{"KEYNAME"} }, "new value") 吗?如果是这样,谁能详细说明一下?我不确定如何继续。 任何的意见都将会有帮助。谢谢!

Perl 散列假定每个键都是唯一的。如果您想在一个键下存储多个值或数据结构,您需要应用一些逻辑来实现所需的结果。

请查看以下演示代码,根据传入数据对教师和学生进行排序。

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %people;
my $re = qr/(\S+)\s+(.*)/;

while( <DATA> ) {
    my($title,$name) = /$re/;
    push @{$people{$title}}, $name;
}

say Dumper(\%people);

while( my($title,$group) = each %people ) {
    say ucfirst $title . ':';
    say "\t$_" for @{$group};
}

__DATA__
teacher Alex Trump
student Amanda Torry
student Nick Popler
student Jonny Sleeper
student Natalie Simpson
teacher George Magic
student Tom Smarty
teacher Pat Golder

输出

$VAR1 = {
          'teacher' => [
                         'Alex Trump',
                         'George Magic',
                         'Pat Golder'
                       ],
          'student' => [
                         'Amanda Torry',
                         'Nick Popler',
                         'Jonny Sleeper',
                         'Natalie Simpson',
                         'Tom Smarty'
                       ]
        };

Teacher:
        Alex Trump
        George Magic
        Pat Golder
Student:
        Amanda Torry
        Nick Popler
        Jonny Sleeper
        Natalie Simpson
        Tom Smarty