arrays - 在 Perl 中从数组读取哈希值

标签 arrays perl csv hash

我是 Perl 新手(昨天晚上开始)。 我对哈希数组有疑问。

以下情况: 我有几个来自日志记录应用程序的 csv 文件。日志文件每天都会创建,而且结构非常糟糕。我想将它们分组在一起并显示一些统计数据。 读取和解析 csv 并不是真正的问题,但我想将列存储在哈希中以便于访问。 在 csv 文件内,第二列 (PhysName) 是我想要对数据进行分组的列。所以我想,最好只将其他列保存在哈希中,将其中几个哈希保存在数组中,并将数组保存在另一个哈希中,其中我将 PhysName 作为键。

这根本不是什么大问题:

my %dauerauftraege;

# Glob all CSV-Files in folder
my @files = glob("*.csv");

foreach my $file(@files) {
    # read the file
    open(DATA, "<$file") or die("Could not open File");

    LINE:
    foreach my $line(<DATA>) {
        chomp($line);
        if ($line eq "") {
            next LINE;
        }

        # Split Line into Fields
        my @line_data = split(";", $line);

        my $phys_name = $line_data[1];

        # skip the header file
        if ($phys_name eq "PhysName") {
            next LINE;
        }

        my %values =(
        'date_time' => $line_data[0],
        'sender' => $line_data[2],
        'recipient' => $line_data[3],
        'format' => $line_data[4],
        'transport' => $line_data[5],
        'partnername' => $line_data[6]);

        push(\@{$dauerauftraege{"$phys_name"}}, \%values);
    }
}

当我尝试使用 print(Dumper(%dauerauftraege)) 验证这一点时我得到以下信息:

$VAR1 = 'YYYYYYYXXXXXXXX';
$VAR2 = [
          {
            'transport' => 'FTP',
            'format' => 'V1',
            'partnername' => 'A_TEST',
            'date_time' => '2016.07.25 11:16:52',
            'sender' => 'BBB',
            'recipient' => 'CCC'
          },
          {
            'recipient' => 'CCC',
            'sender' => 'BBB',
            'partnername' => 'A_TEST',
            'date_time' => '2016.07.25 11:17:15',
            'format' => 'V1',
            'transport' => 'FTP'
          }
        ];
$VAR3 = 'XXXXXXXYYYYYYYY';
$VAR4 = [
          {
            'format' => 'V2',
            'partnername' => 'S_TEST',
            'date_time' => '2016.07.25 10:15:02',
            'recipient' => 'DDD',
            'sender' => 'AAA',
            'transport' => 'HTTP'
          },
          {
            'transport' => 'HTTP',
            'recipient' => 'DDD',
            'sender' => 'AAA',
            'partnername' => 'S_TEST',
            'format' => 'V2',
            'date_time' => '2016.07.25 10:15:30'
          }
        ];

我的第一个想法是,Dumper 将奇数 $VAR 显示为键,将偶数 $VAR 显示为值,但是在我仔细查看了偶数 $VAR 内的哈希后,我很确定我有将内部哈希(包含列和值)插入数组(存储在 %dauerauftraege 中)时出错哈希。

所以,现在当涉及到从哈希中读取时,包含带有此代码的哈希数组

# Get the keys to iterate over them
my @dauerauftraege_keys = keys(%dauerauftraege);
print("count dauerauftraege: ".(scalar @dauerauftraege_keys)."\n");
# iterate over the keys to get the array of hashes
foreach my $dauerauftrag_key (@dauerauftraege_keys) {
    # retrive the array
    my @dauerauftrag = $dauerauftraege{"$dauerauftrag_key"};
    print("count hashes inside the array: ".(scalar @dauerauftrag)."\n");
    # iterate over the hashes and print the values
    foreach my $dauerauftrag_values (@dauerauftrag) {
        print(%{$dauerauftra_values}{'date_time'});
        print("\n");
        print(%{$dauerauftra_values}{'sender'});
        print("\n");
        print(%{$dauerauftra_values}{'recipient'});
        print("\n");
        print(%{$dauerauftra_values}{'format'});
        print("\n");
        print(%{$dauerauftra_values}{'transport'});
        print("\n");
        print(%{$dauerauftra_values}{'partnername'});
        print("\n");
    }
}

我总是收到此错误:

count dauerauftraege: 2
count hashes inside the array: 1
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 56, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 57, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 58, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 59, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 60, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 61, <DATA> line 5.
date_timesenderrecipientformattransportpartnernamecount hashes inside the array: 1
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 56, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 57, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 58, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 59, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 60, <DATA> line 5.
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 61, <DATA> line 5.
date_timesenderrecipientformattransportpartnername

这让我相信,我的问题出在下面一行:

push(\@{$dauerauftraege{"$phys_name"}}, \%values);

当我仔细阅读这一行时,我明白了以下几点: $dauerauftraege{"$phys_name"}返回一个包含数组引用的 skalar ( $ ),该数组由 @{} 取消引用到数组。 现在有 \%values我传递了对 values 的引用哈希到push Funktion,将其添加到数组的引用中,由 \ 指示在@前面。

如果有人能帮助我解决这个问题,我会非常高兴。 非常感谢你们:-)

最佳答案

我认为问题在于如何访问数据结构。试试这个:

my @dauerauftraege_keys = keys %dauerauftraege;
print("count dauerauftraege: ".(scalar @dauerauftraege_keys)."\n");
# iterate over the keys to get the array of hashes
foreach my $dauerauftrag_key (@dauerauftraege_keys) {
    # retrieve the array
    my $dauerauftrag = $dauerauftraege{"$dauerauftrag_key"}; # ref to array
    my @a = @$dauerauftrag;
    print("count hashes inside the array: ".(scalar @a)."\n");
    # iterate over the hashes and print the values
    foreach my $dauerauftrag_values (@a) { # also a reference
        print $dauerauftrag_values->{'date_time'} . "\n";
        print $dauerauftrag_values->{'sender'} . "\n";
        print $dauerauftrag_values->{'recipient'} . "\n";
        print $dauerauftrag_values->{'format'} . "\n";
        print $dauerauftrag_values->{'transport'} . "\n"; 
        print $dauerauftrag_values->{'partnername'} . "\n";
    }
}

关于arrays - 在 Perl 中从数组读取哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39272293/

相关文章:

在 Perl 中解压 32 位 vector 以读取用 C 编写的 uint32 的正确方法

perl - CPAN 首次启动配置

arrays - 在 perl 中,检查数组中的值,如果另一个数组的每个值都存在则将其删除

html - 在 Ruby 中将 CSV 转换为 HTML 表

GHCi 中的 Haskell csv 管道

python - 从 numpy 数组中删除选择索引处的行

java - 从二维数组返回特定​​值

MySQL:如何显示以逗号分隔的 1 列中的数据?

python - 如何修改 numpy 结构化数组中选定行的一列

javascript - node.js 是否提供真正的数组实现?