【转载】出处: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. Yii框架实现restful 接口调用,增删改查

    创建模块modules; 在main.php中配置文件:(1) (2)控制器层: namespace frontend\modules\v1\controllers;use frontend\modu ...

  2. Django框架(四)

    八.Django 模型层(2) 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息. ...

  3. scrapy python2升级python3遇到的坑

    换成Python3首先pycharm先执行: 然后看代码自己所需要的第三方库都要重新装 然后执行代码: 遇到这样的错如下: SyntaxError: invalid syntax 先检查print 所 ...

  4. 生成器yield

    #!/usr/bin/python#coding=utf-8'''Created on 2017年11月23日 from home @author: James zhan ''' def counte ...

  5. Linux c读取系统内存使用信息

    系统的内存使用信息能够在虚拟文件系统/proc/meminfo中找到,如图 所以只要打开/proc/meminfo文件,然后从中读取信息就好了 #include <stdio.h>#inc ...

  6. 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\Program Files\php\php5isapi.dll"

    把 ISAPI 筛选器这里的php配置删掉,php改用fastcgi配置

  7. redis 集群常用命令

    systemctl start redis.service #redis 启动redis-server /etc/redis.conf #redis 加载配置文件启动 redis-cli -h 192 ...

  8. Linux:Ubuntu系统的安装

    好久没更了,今天就更完这一期的Linux系统吧,这次主要安装的是常用Linux系统的之一:Ubuntu(乌班图)系统,这个系统和CentOS 7的安装步骤也是类似的,(我不采取用虚拟机的方法来安装,当 ...

  9. 无法对含有多个.java(或.class)文档的程序进行编译(或解释)

    通常初学者会出现这样的问题:无法对含有多个.java(或.class)文档的程序进行编译(或解释). root@yogile-VirtualBox:/alive/string# javac work/ ...

  10. FreeSWITCH添加中文语音

    1.准备中文语音包 可以到freeswitch官网下载,也可以自己录制 2.中文资源的安装路径:  英文资源的路径为conf/sounds/en/us/callie/...  类似的设置中文资源的路径 ...