在 Perl 中访问从 CSV 导入的散列时出现问题

Problem accessing hash imported from CSV in Perl

我正在使用 Perl 的 Text::CSV 库从 CSV 文件导入数据,使用功能接口。数据存储在哈希数组中,问题是当脚本尝试访问那些 elements/keys 时,它们未初始化(或未定义)。

使用库Dumper,可以看到数组和散列不为空,实际上,它们正确填充了CSV文件的数据。

使用这一小段代码,我得到以下输出:

my $array = csv(
    in => $csv_file,
    headers => 'auto');
foreach my $mem (@{$array}) {
    print Dumper $mem;
    foreach (keys $mem) {
        print $mem{$_};
    }
}

输出的最后一部分:

    $VAR1 = {
          'Column' => '16',
          'Width' => '13',
          'Type' => 'RAM',
          'Depth' => '4096'
        };
Use of uninitialized value in print at ** line 81.
Use of uninitialized value in print at ** line 81.
Use of uninitialized value in print at ** line 81.
Use of uninitialized value in print at ** line 81.

数组的所有元素都会发生这种情况。这个问题与编码有关,还是我只是以不正确的方式访问元素?

当我在我的 Perl (5.24) 版本上 运行 你的代码时,我得到这个错误:

Experimental keys on scalar is now forbidden at ... line ...

这指向行:

foreach (keys $mem) {

您应该取消引用哈希引用:

use warnings;
use strict;
use Data::Dumper;
use Text::CSV qw( csv );
 
my $csv_file="data.csv";
my $array = csv(
    in => $csv_file,
    headers => 'auto');

foreach my $mem (@{$array}) {
    print Dumper($mem);
    foreach (keys %{ $mem }) {
        print $mem->{$_}, "\n";
    }
}

$mem 是对散列的引用,但你一直试图将它直接用作散列。将您的代码更改为:

foreach (keys %$mem) {
    print $mem->{$_};
}

有一点复杂,在某些版本的 perl 中,'keys $mem' 被直接允许作为实验性功能,后来被删除。无论如何,添加

use warnings;
use strict;

可能会为您提供一些有用的线索,让您了解正在发生的事情。