【转载】出处:http://www.cnblogs.com/visayafan/

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

perl二维数组的更多相关文章

  1. perl 二维数组

    perl没有真正的二维数组,所谓的二维数组其实是把一维数组以引用的方式放到另外一个一维数组. 二维数组定义 : my @array1=([1,2],[3,4],[45,9],[66,-5]);     ...

  2. PHP 二维数组根据某个字段排序

    二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数 一. 手写arraysort PHP的一维数组排序函数: sort  对数组的值按 ...

  3. 剑指Offer-【面试题03:二维数组中的查找】

    package com.cxz.question3; /* * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. * 请完成一个函数,输入这样的一个二维数组和 ...

  4. PHP开发笔记:二维数组根据某一项来进行排序

    比如说我们现在有一个二维数组: $arr = array( ‘d' => array(‘id' => 5, ‘name' => 1, ‘age' => 7), ‘b' => ...

  5. 剑指Offer面试题:2.二维数组中的查找

    一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  6. PHP 根据key 给二维数组分组

    我们经常拿到一个二维数组出来,会发现结果和自己想要的有些偏差,可能需要根据二维数组里的某个字段对数组分组.先来看以下数组, Array ( [0] => Array ( [id] => 1 ...

  7. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

  8. 个人学习记录1:二维数组保存到cookie后再读取

    二维数组保存到cookie后再读取 var heartsArray = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0, ...

  9. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

    如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组' ...

随机推荐

  1. git提交代码到码云详解

    一.为什么不用github而使用码云? 私有——免费,速度快 二.怎么用? 1.下载安装好git. 2.去码云官网注册个账号.官网:https://git.oschina.net/ 3.创建项目.项目 ...

  2. noip模拟ernd

    [题目背景]解决了第一题之后,你打开了第二题.这是一道关于树的题目,你很快想出了一个复杂度和树的直径有关的算法,可以通过所有的数据.不过,你的做法常数似乎有点大.为了更好地卡常,你决定构造一些数据来检 ...

  3. 蓝桥杯 算法训练 素因子去重 (java)

    问题描述 给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1   输入格式 一个整数,表示n   输出格式 输出一行,包含一个整数p.   样例输入 1000   ...

  4. <? extends T> <? super T>

    拿前者来说,这其实就是一个指定的泛型,不过这个泛型可以是T及T的任何子类, 如果一个set方法,是把一个泛型对象T赋值给一个泛型T属性,现在这个T变成了<? extends T>,那么se ...

  5. Eclipse安装Activiti Designer插件

    本人使用的是在线安装: 打开Eclipse -> Help -> Install New SoftWare-> Add 然后按照如下对话框输入: Name:Activiti BPMN ...

  6. iOS Runtime 实操练习

    iOS  Runtime 知识详解: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/ 一般可以运行Runtime进行以下操作 ...

  7. 第k大元素

    在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注意 你可以交换数组 ...

  8. c# 如何 使用共用体

    用起来真的方便 转摘如下: C#借助FieldOffset属性实现共用体与强制类型转换 这两天被C#的强制类型转换弄得有点不习惯.事出如此. 在C#中,我打算读二进制文.文件的结构很简单,一连串的紧密 ...

  9. [LeetCode&Python] Problem 458. Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  10. linux基础之系统管理类命令

    系统管理类命令 1.reboot.halt.poweroff命令 基本介绍 reboot命令.halt命令.poweroff命令:都表示重启或者关闭系统 基本语法 reboot/halt/powero ...