首页 > 解决方案 > 如何在现代 perl 中使用伪散列?

问题描述

我以下一种格式加载了数据(可能从.csv文件中加载):

my $data =  [
   [ 'id', 'name', 'value' ],
   [   23,  'foo',      77 ],
   [   44,  'bar',   'dfd' ],
]

我想访问如下数据:

$data->[$n]{ name }

我知道在旧的 perl 中我可以使用phash(伪哈希),但它已被弃用并被fieldspragma 取代。

据我所知,它用于对象。就我而言,我不创建对象也不使用类。

我应该如何fields在我的用例中使用?请提供一个例子

标签: perlhash

解决方案


使用Text::CSV_XS模块读取您的 CSV 数据,并根据第一行告诉它列名是什么:

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use Text::CSV_XS;

my $csv = Text::CSV_XS->new({binary => 1, auto_diag => 1});
$csv->column_names($csv->getline(\*DATA));
my $data = $csv->getline_hr_all(\*DATA);
say $data->[0]->{'name'}; # prints foo

__DATA__
id,name,value
23,foo,77
44,bar,dfd

不过,考虑循环遍历记录而不是一次读取整个文件。getline_hr有关执行此操作的几种方法,请参阅文档。


推荐阅读