免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3788 | 回复: 15
打印 上一主题 下一主题

perl解析复杂数据结构时引用带来的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-21 16:08 |只看该作者 |倒序浏览
最近在使用perl解析稍微复杂点格式的数据时遇到困惑。因为复杂数据是依靠引用连接起来的,但是每次都要解引用,明确告诉perl这里其实是一个hashtab,这个引用是一个数组,然后操作其元素。每次都foreach my $sss ( @{$data} )这样挺纠结的,有时候还得拷贝一份hashtab或者数组的副本,这样要修改原始数据的时候又麻烦了。是有我不知道的解决办法,还是语言特性如此?(我use warnings和use strict)

比如说如下这份来自json的数据,要修改pktRecv中的某些值。

论坛徽章:
0
2 [报告]
发表于 2012-08-21 16:09 |只看该作者
$VAR1 = {
          'JSChart' => {
                         'datasets' => [
                                         {
                                           'data' => [
                                                       {
                                                         'pktRecv' => '2902607',
                                                         'time' => '1344614400',
                                                         'byteRecv' => '1542688768'
                                                       },
                                                       {
                                                         'pktRecv' => '5296108',
                                                         'time' => '1344614700',
                                                         'byteRecv' => '2814056448'
                                                       },
                                                       {
                                                         'pktRecv' => '2269288',
                                                         'time' => '1344615000',
                                                         'byteRecv' => '1205422080'
                                                       },
                                                       {
                                                         'pktRecv' => '858125',
                                                         'time' => '1344629400',
                                                         'byteRecv' => '456594432'
                                                       },
                                                       {
                                                         'pktRecv' => '883033',
                                                         'time' => '1344629700',
                                                         'byteRecv' => '469655552'
                                                       },
                                                       {
                                                         'pktRecv' => '880745',
                                                         'time' => '1344630000',
                                                         'byteRecv' => '468205568'
                                                       },
                                                       {
                                                         'pktRecv' => '1075241',
                                                         'time' => '1344630300',
                                                         'byteRecv' => '571540480'
                                                       },
                                                       {
                                                         'pktRecv' => '1244995',
                                                         'time' => '1344630600',
                                                         'byteRecv' => '661620736'
                                                       },
                                                       {
                                                         'pktRecv' => '1221087',
                                                         'time' => '1344630900',
                                                         'byteRecv' => '648822784'
                                                       },
                                                       {
                                                         'pktRecv' => '1149240',
                                                         'time' => '1344631200',
                                                         'byteRecv' => '610515968'
                                                       },
                                                       {
                                                         'pktRecv' => '1068030',
                                                         'time' => '1344631500',
                                                         'byteRecv' => '567103488'
                                                       },
                                                       {
                                                         'pktRecv' => '885617',
                                                         'time' => '1344631800',
                                                         'byteRecv' => '469921792'
                                                       },
                                                       {
                                                         'pktRecv' => '1222722',
                                                         'time' => '1344632100',
                                                         'byteRecv' => '649026560'
                                                       },
                                                       {
                                                         'pktRecv' => '1400129',
                                                         'time' => '1344632400',
                                                         'byteRecv' => '743264256'
                                                       },
                                                       {
                                                         'pktRecv' => '1387575',
                                                         'time' => '1344632700',
                                                         'byteRecv' => '736407552'
                                                       },
                                                       {
                                                         'pktRecv' => '1365123',
                                                         'time' => '1344633000',
                                                         'byteRecv' => '724296704'
                                                       },
                                                       {
                                                         'pktRecv' => '1340514',
                                                         'time' => '1344633300',
                                                         'byteRecv' => '710953984'
                                                       },
                                                       {
                                                         'pktRecv' => '1575669',
                                                         'time' => '1344633600',
                                                         'byteRecv' => '835874816'
                                                       },
                                                       {
                                                         'pktRecv' => '1600285',
                                                         'time' => '1344633900',
                                                         'byteRecv' => '848697344'
                                                       },
                                                       {
                                                         'pktRecv' => '1791717',
                                                         'time' => '1344634200',
                                                         'byteRecv' => '950289408'
                                                       },
                                                       {
                                                         'pktRecv' => '1818375',
                                                         'time' => '1344634500',
                                                         'byteRecv' => '964213760'
                                                       },
                                                       {
                                                         'pktRecv' => '1902925',
                                                         'time' => '1344634800',
                                                         'byteRecv' => '1008971776'
                                                       },
                                                       {
                                                         'pktRecv' => '1901335',
                                                         'time' => '1344635100',
                                                         'byteRecv' => '1007890432'
                                                       },
                                                       {
                                                         'pktRecv' => '1880593',
                                                         'time' => '1344635400',
                                                         'byteRecv' => '996676608'
                                                       },
                                                       {
                                                         'pktRecv' => '2142081',
                                                         'time' => '1344635700',
                                                         'byteRecv' => '1135567872'
                                                       },
                                                       {
                                                         'pktRecv' => '2166007',
                                                         'time' => '1344636000',
                                                         'byteRecv' => '1148085248'
                                                       },
                                                       {
                                                         'pktRecv' => '2144592',
                                                         'time' => '1344636300',
                                                         'byteRecv' => '1136451584'
                                                       },
                                                       {
                                                         'pktRecv' => '2037094',
                                                         'time' => '1344636600',
                                                         'byteRecv' => '1079072768'
                                                       },
                                                       {
                                                         'pktRecv' => '1983139',
                                                         'time' => '1344636900',
                                                         'byteRecv' => '1050245120'
                                                       },
                                                       {
                                                         'pktRecv' => '1977387',
                                                         'time' => '1344637200',
                                                         'byteRecv' => '1046992896'
                                                       },
                                                       {
                                                         'pktRecv' => '2139754',
                                                         'time' => '1344637500',
                                                         'byteRecv' => '1133149184'
                                                       },
                                                       {
                                                         'pktRecv' => '2304585',
                                                         'time' => '1344637800',
                                                         'byteRecv' => '1220594688'
                                                       },
                                                       {
                                                         'pktRecv' => '2432887',
                                                         'time' => '1344638100',
                                                         'byteRecv' => '1288675328'
                                                       },
                                                       {
                                                         'pktRecv' => '2543064',
                                                         'time' => '1344638400',
                                                         'byteRecv' => '1347056640'
                                                       },
                                                       {
                                                         'pktRecv' => '2595793',
                                                         'time' => '1344638700',
                                                         'byteRecv' => '1374845952'
                                                       },
                                                       {
                                                         'pktRecv' => '2876857',
                                                         'time' => '1344639000',
                                                         'byteRecv' => '1524556800'
                                                       },
                                                       {
                                                         'pktRecv' => '2842259',
                                                         'time' => '1344639300',
                                                         'byteRecv' => '1505725440'
                                                       },
                                                       {
                                                         'pktRecv' => '2734701',
                                                         'time' => '1344639600',
                                                         'byteRecv' => '1448142848'
                                                       },
                                                       {
                                                         'pktRecv' => '2774369',
                                                         'time' => '1344639900',
                                                         'byteRecv' => '1468944384'
                                                       },
                                                       {
                                                         'pktRecv' => '3117504',
                                                         'time' => '1344640200',
                                                         'byteRecv' => '1651357696'
                                                       },
                                                       {
                                                         'pktRecv' => '3155205',
                                                         'time' => '1344640500',
                                                         'byteRecv' => '1671042048'
                                                       },
                                                       {
                                                         'pktRecv' => '2940077',
                                                         'time' => '1344640800',
                                                         'byteRecv' => '1556251648'
                                                       },
                                                       {
                                                         'pktRecv' => '3224650',
                                                         'time' => '1344641100',
                                                         'byteRecv' => '1707480064'
                                                       },
                                                       {
                                                         'pktRecv' => '3201723',
                                                         'time' => '1344641400',
                                                         'byteRecv' => '1694983168'
                                                       },
                                                       {
                                                         'pktRecv' => '3355557',
                                                         'time' => '1344641700',
                                                         'byteRecv' => '1776473088'
                                                       },


论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-08-21 16:36 |只看该作者
所以新版 Perl 已经在许多地方支持自动解引用了。参见:
http://search.cpan.org/~rjbs/per ... s_accept_references

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-08-21 16:59 |只看该作者
这个很强大

论坛徽章:
0
5 [报告]
发表于 2012-08-21 17:05 |只看该作者
回复 3# flw


    多谢,看起来能解决一些问题,我试试看。

论坛徽章:
0
6 [报告]
发表于 2012-08-21 18:26 |只看该作者
自己写个foreach函数,实现自动解引用吧

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2012-08-21 21:38 来自手机 |只看该作者
你理想中是什么样子,像SQL 那样声明式的?应该有模块或者你可以自己写一个啊

论坛徽章:
0
8 [报告]
发表于 2012-08-22 14:37 |只看该作者
这个应该由语言自己来实现。

论坛徽章:
0
9 [报告]
发表于 2012-08-22 15:00 |只看该作者
回复 8# 撒哈拉里的鱼


    语言又怎么知道你何时需要解引用,何时不需要解引用呢,一个人的需求不能代表所有人的。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2012-08-22 15:07 |只看该作者
撒哈拉里的鱼 发表于 2012-08-22 14:37
这个应该由语言自己来实现。


for my $item (@{$VAR1->{JSChart}->{datasets}->{data}}) {
        $item->{pktRecv} = "something";
}

这样不可以吗?要想再抽象就要往 DSL 方向发展了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP