• 1 数组与引用
  • 2 声明的区别
  • 3 访问的区别
  • 4 添加行元素
  • 5 添加列元素
  • 6 访问与打印
    • 6.1 运算符优先级
    • 6.2 访问一个
    • 6.3 遍历
  • 7 切片

1 数组与引用

此处引用相当于C中的指针。
二维数组第一列不存储具体元素而是存储指向该行一维数组的引用。

2 声明的区别

  • 数组用如下形式声明:
    数组名前加@,之后用()。
my @AoA = ([ "fred", "barney", "pebbles", "bambam", "dino", ],[ "george", "jane", "elroy", "judy", ],[ "homer", "bart", "marge", "maggie", ],);
  • 引用如下形式声明:
    引用名前用$,之后用[]。
$ref_to_AoA = [[ "fred", "barney", "pebbles", "bambam", "dino", ],[ "george", "jane", "elroy", "judy", ],[ "homer", "bart", "marge", "maggie", ],];

3 访问的区别

  • 数组访问
$AoA[$i][$j]

因为第一列数组里面存放的是引用,所以还可以这样访问:

$AoA[$i]->[$j]
  • 引用访问
$ref_AoA->[$i][$j]

同理引用还可以这样访问:

$ref_AoA->[$i]->[$j]

4 添加行元素

my (@AoA, $ref_to_AoA);sub print_AoA{for (@AoA) {print "@{$_}\n";}print "\n";
}# assign to our array, an array of array references
@AoA = ([ "fred", "barney", "pebbles", "bambam", "dino", ],[ "george", "jane", "elroy", "judy", ],[ "homer", "bart", "marge", "maggie", ],);
say $AoA[2][1];$ref_to_AoA = [[ "fred", "barney", "pebbles", "bambam", "dino", ],[ "george", "jane", "elroy", "judy", ],[ "homer", "bart", "marge", "maggie", ],];
print_AoA();my @tmp = (1, 2, 3, 4);
push @AoA, [@tmp];              # 因为数组AoA第一列需要的是引用,而@tmp是数组,直接赋值会出错。[]表示返回@tmp的引用,即把@tmp的引用push到@AoA最后一行,二维数组行数加1.
print_AoA();push @AoA, @tmp;
print_AoA();

覆盖行

#$AoA[0] = @tmp;   #$AoA[0]是scalar型,而@tmp是list型,所以用默认把tmp的个数赋给$AoA[0],即$AoA[0]=4;
$AoA[0] = [@tmp];  #overwirte
print_AoA();

5 添加列元素

push @{$AoA[0]}, "wilma", "betty";

省略@{}

use v5.14;   # needed for implicit deref of array refs by array ops
push $AoA[0], "wilma", "betty";          # 在5.14版本之前不能通过,因为以前规定push的第一参数必须为数组。在新版本中当$AoA[0]中存在引用时可以通过,但无引用时不正确。
print_AoA();
my $aref = undef;
#push $aref, qw/some value/;     # 出错:Not an ARRAY reference
my $aref = [@tmp];
push $aref, qw/some value/;     # 正确,因为aref此时不是个空引用
print "$aref : @$aref\n";

6 访问与打印

6.1 运算符优先级

$@*%&

6.2 访问一个

print $AoA[$i][$j];
print ref_$AoA->[$i]->[$j];

6.3 遍历

  • 最简单的一种
for $aref ( @AoA )                #  $aref只是第一列里面的引用,要想访问整行必须加@,又$访问级别比@高,所以()可以省略。
{say "\t [ @$aref ],";
}
  • 使用$#
for my $i (0 .. $#AoA){say "elt $i is @{$AoA[$i]}";
}
  • 内嵌循环
for my $i (0 .. $#AoA){for my $j (0 .. $#{$AoA[$i]}){say "elt $i, $j is $AoA[$i][$j]\n";}
}

7 切片

要访问几行几列元素。和Matlab中访问矩阵的方法差不多。

  • 切单行多列
my @part = ();
my $x = 4;
for (my $y = 1; $y<4; $y++){push @part, $AoA[$x][$y];
}
# 简单写法
@part = @{$AoA[4]}[1..4];
  • 切多行多列
my @newAoA = ();
for (my $startx= my $i = 1; $i<=5; $i++){for(my $starty = my $j = 2; $j<=4; $j++){$newAoA[$i - $startx][$j - $starty] = $AoA[$i][$j];}
}#一个循环简单写法
for (my $x = 1; $x<=5; $x++){push @newAoA, [@{$AoA[i]}[2 .. 4]];
}
  • 编写函数
sub splice_2D{my $lrr = shift;my($x_l, $x_h,$y_l, $y_h) = @_;return map([ @{$lrr -> [$_]} {$y_l .. $y_h}])$x_l .. $x_h;
}
@newAoA = splice_2D(\@AoA, 1=>5, 2=>4);

Author: visaya fan <visayafan[AT]gmail.com or visayafan[AT]163.com>

Date: 2011-10-29 15:00:34

HTML generated by org-mode 6.33x in emacs 23

转载于:https://www.cnblogs.com/visayafan/archive/2011/10/29/2228596.html

【Perl】二维数组相关推荐

  1. php 二维数组中去重,PHP实现二维数组去重功能示例

    PHP实现二维数组去重功能示例 发布于 2017-08-07 21:05:17 | 68 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Prep ...

  2. Java IDEA Debug进制二维数组

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...

  3. Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片

    ''' 来源:天善智能韦玮老师课堂笔记 1.numpy 可以高效处理数据.提供数组支持.很多模块都依赖他,比如pandas.scipy.matplotlib都依赖他,所以这个模块是基础. 2.pand ...

  4. Numpy 生成 Bool型数组、一维转多维数组reshape、多维转一维数组、替换数组元素、提取数组元素、数组交集、差集、过滤数组元素、二维数组反转行、交换数组维度

    1. 创建一个 [3,5] 所有元素为 True 的数组 In [162]: b = np.ones((3,5), dtype=bool)In [163]: b Out[163]: array([[ ...

  5. Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)

    参考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665 打开 IPython ,创建 Python ...

  6. C++二维数组名与数组指针的思考

    二维数组名和数组指针可以当做一个东西用,但两者之间的含义是不同的. 二维数组名是一个指向数组中所有元素的指针,而数组指针是一个行指针.体现在sizeof()上的不同. #include <ios ...

  7. 建立二维数组_二维数组的 DP

    寻找不同路径和 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标 ...

  8. c语言N*N的二维数组,c语言高手帮个忙(请先看问题,好解答

    程序定义了N×N的二维数组,并在主函数中自动赋值.请编写函数fun(int a[ ][ N ],int n),该函数的功能是使数组左下半三角元素中的值加上n.例如:若n的值为3,a数组中的值为a=2 ...

  9. cout 数组_C语言学习笔记(十)二维数组内存预设

    1 问题描述 二维数组存储数据数量根据其他方法间接获得: 为当前数据数量申请内存: 2 相关程序 #include --2020.11.23--

最新文章

  1. Python 赋值、浅拷贝、深拷贝的区别?
  2. 注解版poi操作工具
  3. 2018年C语言期末考试题及答案,HZNUOJ--2018年秋季学期程序设计基础(C语言)期末考试(补题)...
  4. python爬取热门新闻每日排行_用python查看百度搜索中今日热点事件排行榜
  5. HTTPS客户端的java实现
  6. 吴恩达机器学习视频笔记和编程作业(Python实现)汇总
  7. 无法弹出U盘的几种解决方法
  8. 解方程计算器,一款数学神器APP,有需要的自己收藏!
  9. 《Google软件测试之道》读书笔记---第一章
  10. 手机只能上QQ不能看网页
  11. 68个经典励志小故事|哲理小故事,让你终身受益(3)
  12. eNSP-配置单臂路由与静态路由实验
  13. #Paper Reading# Implicit Neural Representations with Periodic Activation Functions
  14. 用echartsjs 实现动态绘制折线、柱状等图形,并实现多图联动效果
  15. 网络原理 | 网络设备及相关技术(集线器、交换机、主机、路由器)、冲突域与广播域
  16. [英雄星球六月集训LeetCode解题日报] 第七日 哈希表
  17. DNA与剑桥的老鹰酒吧
  18. Matlab:常用命令大全
  19. GV2、GV3、GV4热磁和单磁断路器区别是什么?
  20. webpack打包时提示Invalid configuration object错误

热门文章

  1. 蓝色梦想,再次起航 | 水下目标检测算法比赛正式开赛!
  2. Transformers资料汇总!从原理到应用
  3. 1080Ti 就搞定最新 SOTA 模型?一个普通研究生勇敢发毕业论文引起热议
  4. 火星无人机「机智号」代码开源,1.2w人参与贡献
  5. 10个问题看透Transformer
  6. 道理我都懂,但是神经网络反向传播时的梯度到底怎么求?
  7. 知乎热议:985 计算机视觉研究生找不到工作怎么办?
  8. 2019男生身高受欢迎程度表
  9. 1000行 MySQL 学习笔记,不怕你不会,就怕你不学!
  10. 并发编程专题——第二章(并发编程之Synchronized详解)