为什么perl哈希会覆盖以前的数据?

时间:2020-10-21 02:15:12

标签: perl hash key

因此,我正在将数据写入哈希%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")吗?如果是这样,有人可以详细说明吗?我不确定该如何进行。 任何的意见都将会有帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

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