免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1386 | 回复: 4

请教大神关于@AoA添加一行数据 [复制链接]

论坛徽章:
0
发表于 2016-08-21 22:00 |显示全部楼层
我看网上的教程都是说,往二维列表@AoA里面添加一行,要用[@array]的形式:
  1. while (<>) {
  2.     @tmp = split;           # Split elements into an array.
  3.     push @AoA, [ @tmp ];    # Add an anonymous array reference to @AoA.
  4. }
复制代码
然后我自己试验的时候,这样写:

  1. my @AoA = ([1,2,3],
  2.                    [4,5,6],
  3.                    [7,8,9]
  4.         );

  5. my @add = ["aa", "bb","cc"];
  6. push @AoA, [ @add ] ;

  7. foreach (@AoA){
  8. print join(' ', @$_), "\n";
  9. }
复制代码
然后发现并打印不出来加的一行呢,结果是:
  1. 1 2 3
  2. 4 5 6
  3. 7 8 9
  4. ARRAY(0x6cc6a8)
复制代码
而如果我用
push @AoA, @add;
就没有错了。

这是为什么?



论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-08-21 22:50 |显示全部楼层
这行代码有问题:

my @add = ["aa", "bb","cc"];

应该为

my @add = ("aa", "bb","cc");

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-08-22 00:22 |显示全部楼层
想看二维数组的结构, 打印是打印不出来的, 要用模块, 推荐用 JSON

  1. use 5.020;
  2. use JSON qw(encode_json decode_json);

  3. my $array = [1,2,3];
  4. my $push_array = [ push @$array, [4,5,6] ];

  5. say encode_json($push_array);
复制代码


我也不知道以上的代码能不能运行, Perl 的引用是后来加上的, 所以直接往引用里 push, 在新版本中不被支持了.

Perl 有两种表示数组的方法:
直接量:
  1. my @array = (1,2,3);
复制代码

引用:
  1. my $array = [1,2,3];
复制代码

直接量和引用在使用的时候除了语法略微不同外, 在当成参数传入函数的时候, 引用传递的是指针, 而直接量传递的是值.

大部分针对数组的函数, 都是针对直接量的, 要针对引用, 要显式的解引用.

  1. my $array = [1,2,3];

  2. my @array = @{ $array };

  3. my $ref_array = [ @array ];
复制代码


获取数组元素,  针对直接量和引用也不同:

  1. my $array = [1,2,3];
  2. my $first_value = $array->[0];
复制代码


  1. my @array = (1,2,3);
  2. my $first_value = $array[0];
复制代码


这很容易让人迷糊, 所以, Perl6 做了改进:

  1. my @array = [1,2,3];
  2. my $first_array = @array[0];
复制代码


针对以上种种别扭, 我写代码统一使用引用, 然后加个语句, 让所有的引用都和直接量一样:

  1. use 5.018;
  2. use JSON::XS qw(encode_json decode_json);
  3. use experimental qw(switch autoderef);
复制代码


能彻底不关心这些破事, 最好了.

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
发表于 2016-08-22 11:06 |显示全部楼层
  1. @add的锅,它本身就是一个二维数组了。
  2. @AoA的数据值为:
  3. (
  4.   [
  5.     1,
  6.     2,
  7.     3
  8.   ],
  9.   [
  10.     4,
  11.     5,
  12.     6
  13.   ],
  14.   [
  15.     7,
  16.     8,
  17.     9
  18.   ],
  19.   [
  20.     [
  21.       'aa',
  22.       'bb',
  23.       'cc'
  24.     ]
  25.   ]
  26. );
复制代码

论坛徽章:
0
发表于 2016-09-05 13:35 |显示全部楼层
感谢大家!确实是我那个@add有问题。
系统没有提示我有新回答,我还以为没人理我呢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP