在 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;
可能会为您提供一些有用的线索,让您了解正在发生的事情。
我正在使用 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;
可能会为您提供一些有用的线索,让您了解正在发生的事情。