perl - 如何在现代 perl 中使用伪散列?
问题描述
我以下一种格式加载了数据(可能从.csv
文件中加载):
my $data = [
[ 'id', 'name', 'value' ],
[ 23, 'foo', 77 ],
[ 44, 'bar', 'dfd' ],
]
我想访问如下数据:
$data->[$n]{ name }
我知道在旧的 perl 中我可以使用phash(伪哈希),但它已被弃用并被fields
pragma 取代。
据我所知,它用于对象。就我而言,我不创建对象也不使用类。
我应该如何fields
在我的用例中使用?请提供一个例子
解决方案
使用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
有关执行此操作的几种方法,请参阅文档。
推荐阅读
- php - PHP 消息:PHP 警告:ini_set():会话处于活动状态。PHP 7 升级后此时您无法更改会话模块的 ini 设置
- javascript - 使用 window.location.replace("xx"); 重定向页面 基于一个条件
- spring-cloud-stream - 供应商绑定不适用于 spring cloud stream rabbit
- javascript - 更改 HTML
在 Flask 可变负载上使用 JavaScript 标记
- c++ - 当空基类也是成员变量时,为什么禁止空基优化?
- android - Android 预览不显示自定义视图,但在设备上可见
- java - 将异常与结构化参数一起记录
- python - Python。解析 csv 文件。如果下一行有重复值,则将值附加到上一行
- python - 如何根据列内容重新组织熊猫数据框
- linux - 如何在linux中杀死crontab脚本的旧进程