perl二维数组

阳光总能让人感到温暖 阳光总能让人感到温暖     2022-08-26     176

关键词:

【转载】出处: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输出一个二维数组?

...要在屏幕上看到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的所有键都映射到某个东西,除此之... 查看详情