关键词:
【转载】出处: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);
Date: 2011-10-29 15:00:34
HTML generated by org-mode 6.33x in emacs 23
怎么用perl输出一个二维数组?
...要在屏幕上看到00000000000000000000可以用一个foreach语句输出二维数组例如二维数组:@arr=([0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0],&nbs... 查看详情
perl如何求二维数组的大小
参考技术Aperl的二维数组各个行可以不一样的长度,可以参考下面的程序@m=([1,2,3,4],[3,4,5,6],[7,8,9]);$row=$#m;$col0=$#$m[0];$col1=$#$m[1];$col2=$#$m[2];print"total$rowrows\nrow0has$col0columns\nrow1has$col1columns\nrow2has$col2columns\n";本回答... 查看详情
[perl]perl中二维哈希hash与python二维字典dict
参考技术A(1)首先,python中存储和读取二维字典dict;则是利用嵌套存储字典的方式输出内容为:perl中的使用没有python方便,涉及到二维hash的字典,需要说明一种写法;perl中写法比较多等效于已知key1,想遍历key2;涉及到解引用的方... 查看详情
perl数组的长度与元素个数
perl数组的长度与元素个数$#数组名---表示数组中最后一个元素的下标,它等于元素个数减1。@数组名---表示数组中元素的个数。$标量[email protected]数组名---将一个数组赋值给一个标量变量,标量得到的是这个数组的元素个数... 查看详情
Perl + Python - 如何将 perl 中的数组作为参数传递给 python 函数
】Perl+Python-如何将perl中的数组作为参数传递给python函数【英文标题】:Perl+Python-Howtopassarrayfromperlasanargumenttoapythonfunction【发布时间】:2022-01-1108:43:57【问题描述】:我有一个perl脚本,它调用一个带有数组作为参数的python函数。p... 查看详情
Perl:构造对象数组
】Perl:构造对象数组【英文标题】:Perl:Constructinganarrayofobjects【发布时间】:2011-09-2615:21:12【问题描述】:与thisquestion部分相关但不同,因为这是关于构造函数调用...我想创建一个包含固定数量对象的数组。我可以这样做:my@ob... 查看详情
请问怎么给perl里的标量,哈希,数组赋初值?
...;printqq$hasha->1\n;上面这种情况,其实就是申明了一个二维哈希 查看详情
perl变量:数组变量(代码片段)
Perl数组Perl数组一个是存储标量值的列表变量,变量可以是不同类型。数组变量以@开头。访问数组元素使用$+变量名称+[索引值]格式来读取。1、创建数组1.数组变量以@符号开始,元素放在括号内,2.以qw开始定义数组,第二个数... 查看详情
Perl 如何将数组作为参数传递给另一个 Perl 脚本
】Perl如何将数组作为参数传递给另一个Perl脚本【英文标题】:PerlhowtopassarrayasanargumenttoanotherPerlscript【发布时间】:2019-10-1714:50:28【问题描述】:我有2个perl脚本,其中primary_script.pl将通过将数组作为参数传递来调用secondary_script.... 查看详情
Perl:计算数组大小时不是数组引用
】Perl:计算数组大小时不是数组引用【英文标题】:Perl:notanarrayreferencewhilecalculatingarraysize【发布时间】:2019-04-1915:06:42【问题描述】:我正在尝试解开一些遗留代码,如果它的大小大于x(其中x是硬编码的int),则对$value进行... 查看详情
Perl 数组与列表
】Perl数组与列表【英文标题】:Perlarrayvslist【发布时间】:2011-08-2619:11:35【问题描述】:我在Perl中有两个数据结构:一个数组:my@array2=("1","2","3");for$elem(@array2)print$elem."\\n";给我以下输出:123还有一个清单:my@array=["1","2","3"];for$... 查看详情
遍历 Perl 数组的最佳方法
】遍历Perl数组的最佳方法【英文标题】:BestwaytoiteratethroughaPerlarray【发布时间】:2012-05-1606:28:39【问题描述】:遍历Perl数组的最佳实现是(就速度和内存使用而言)?有没有更好的办法?(@Array不需要保留)。实施1foreach(@Array)... 查看详情
perl访问数组中参数
数组一个是存储标量值的无序列表变量。数组变量以@开头。访问数组元素使用 $+变量名称+[索引值] 格式来读取,实例如下:#!/usr/bin/perl@names=("google","runoob","taobao");print"$names[0]=$names[0] ";#$names[0]=google用变量接收数组及访问... 查看详情
Perl 中的数组和负索引
】Perl中的数组和负索引【英文标题】:ArraysandnegativeindexesinPerl【发布时间】:2013-04-0110:11:34【问题描述】:我是Perl的新手,我正在阅读有关数组的内容。据我了解,数组会根据需要自动扩展(酷!)但我也读到我们可以使用负... 查看详情
Perl:将数组分配给哈希
】Perl:将数组分配给哈希【英文标题】:Perl:Assigninganarraytoahash【发布时间】:2011-07-2001:56:55【问题描述】:此语法有效:$b"x"=[1,2,3];pp%b;#Displays("x",[1,2,3])但我需要能够动态创建数组的内容并在以后分配它。这不起作用;帮助,... 查看详情
Perl:如何解释数组和标量的否定?
】Perl:如何解释数组和标量的否定?【英文标题】:Perl:Howistobeinterpretedanegationofanarrayandscalar?【发布时间】:2022-01-1417:48:50【问题描述】:如果我对数组或标量进行求反会发生什么?使用下面的脚本我得到了这些结果:$x=0--------... 查看详情
Perl:展平多维数组的最简单方法是啥?
】Perl:展平多维数组的最简单方法是啥?【英文标题】:Perl:Whatistheeasiestwaytoflattenamultidimensionalarray?Perl:展平多维数组的最简单方法是什么?【发布时间】:2011-07-0704:53:04【问题描述】:扁平化多维数组最简单的方法是什么?... 查看详情
Perl,将数字键哈希转换为数组
】Perl,将数字键哈希转换为数组【英文标题】:Perl,convertnumerically-keyedhashtoarray【发布时间】:2011-02-2320:04:45【问题描述】:如果我在Perl中有一个包含完整和连续整数映射的哈希(即,从0到n的所有键都映射到某个东西,除此之... 查看详情