`
Eileenlml
  • 浏览: 72567 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

二维数组perl

 
阅读更多

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

分享到:
评论

相关推荐

    2dloop2darray_pl_depCheck.7z

    标题中的“2dloop2darray_pl_depCheck.7z”暗示了这是一个关于二维循环、二维数组以及在Perl编程语言中进行依赖性检查的压缩文件。在这个文件中,可能包含了一个或多个源代码文件,用于演示如何在Perl中处理二维数组...

    2dloop2darray_pl_functionAccess.7z

    标题“2dloop2darray_pl_functionAccess.7z”暗示了这个压缩包可能包含一个或多个文件,涉及二维数组(2D array)在Perl语言中的操作,特别是关于循环(loop)和函数访问(function access)相关的编程内容。在Perl...

    perl二维哈希

    Perl中的二维哈希,也称为关联数组的嵌套,是一种数据结构,允许你在一个哈希中存储另一个哈希。这使得处理多级或复杂的数据结构成为可能,特别适合于需要组织多个相关数据集的情况。在Perl中,哈希通常用百分号 `%`...

    2dloop2darray_pl.7z

    标题中的“2dloop2darray_pl”暗示了我们即将探讨的是二维循环和二维数组在编程语言中的应用,特别是与Perl语言相关的内容。在Perl中,二维数组是一种强大的数据结构,用于存储多列或多行的数据。它是由一维数组构成...

    2dloop2darray_pl_apint.7z

    标题中的“2dloop2darray_pl_apint.7z”可能是指一个关于二维循环、二维数组以及在Perl编程语言中使用整数(apint)的压缩文件。由于标签为空,我们无法直接获取额外的上下文信息,但我们可以根据文件名推测其内容。...

    2dloop2darray_pl_subf.7z

    标题“2dloop2darray_pl_subf.7z”暗示了这个压缩包可能包含一个或多个文件,涉及二维数组、循环以及可能是Perl语言的子函数。从描述中我们无法获取更多具体信息,因为“2dloop2darray_pl_subf.7z”只是文件名,不...

    Perl数据结构

    在Perl中,数组的数组是最常见的数据结构之一,常被称为二维数组或矩阵。这种数据结构通过将多个数组对象存储在一个数组中来实现。 ##### 1. 创建与访问 创建一个二维数组的基本方式是先定义一个数组,然后将其...

    2D-array-sort.zip_LabVIEW 数组_labview_labview array_perl sort arr

    在这个实验中,通过“二维数组快速排序.vi”,你可以学习如何在LabVIEW中设计交互式界面,如何处理2D数组,以及如何实现快速排序算法。同时,也可以了解到LabVIEW中的数据操作和控制流程,这对于提高LabVIEW编程技能...

    perl导入打分矩阵并对序列比对时进行打分

    矩阵通常是以二维数组的形式存储,每行和每列都代表一个氨基酸。Perl的`&lt;DATA&gt;`文件句柄或者`open`函数可以用来读取包含矩阵数据的文本文件。接着,代码会将这些数据解析成适当的数组结构,以便于在比对时快速查找...

    php在数组中查找指定值的方法

    输出结果是"Search1:1"表示找到了"PHP"在第二个位置(注意数组的索引是从0开始的),"Search2:0"表示"Perl"在数组的第一个位置,而"Search3:"后面没有值因为"C#"不在数组中。 接着,我们来看看`in_array`函数。`in_...

    俄罗斯方块perl版

    在Perl中,我们可以使用二维数组来存储方块的位置和形状。每个单元格可以被赋值为0(空)或非零(代表不同形状的方块)。同时,我们需要定义一系列预设的方块形状,并在游戏开始时随机选择一个作为初始方块。 用户...

    关于perl DBI的方法使用

    - `fetchall_hashref_arrayref()`:获取所有查询结果作为包含哈希引用的二维数组引用。 - `commit()`:提交当前事务。 - `rollback()`:回滚当前事务。 5. 其他特性: - 错误处理:通过`err`, `errstr`, 和 `...

    文件转C语言数组

    例如,我们可以创建一个二维数组,其中每个元素都是一个`uint16_t`,代表UTF-16编码的汉字: ```c const uint16_t file_data[] = {0x4E2D, 0x6587, ...}; // 假设'汉'的UTF-16编码是0x4E2D, '字'是0x6587 ``` 数组...

    Perl技术内幕

    4. 引用和数据结构:Perl有独特的引用机制,允许创建复杂的数据结构,如数组和哈希的数组(二维数组)或哈希的哈希(哈希表)。 5. 包和模块:Perl有一个庞大的模块生态系统,这些模块可以轻松地集成到Perl程序中,...

    Perl编程24学时教程

    3. **字符串和数组**:了解如何在Perl中操作字符串,包括连接、查找、替换等操作,并深入理解数组的概念,包括一维数组、多维数组的使用。 4. **散列(哈希)**:Perl的散列数据结构提供了一种高效的方式来存储和...

    Perl语言参考手册

    9. **引用和数据结构**:Perl允许创建复杂的数据结构,如数组的数组(二维数组)、哈希的哈希等,通过引用机制实现。 10. **函数和过程**:Perl支持自定义函数,以及如何定义和调用它们。 11. **符号表和变量作用...

    perl Excel操作

    # 写入二维数组 my @data = ( ['Name', 'Age'], ['John', 30], ['Jane', 25] ); $worksheet-&gt;write_col(0, \@data); $workbook-&gt;close(); ``` 除了这两个核心模块,还有其他一些扩展模块,如Spreadsheet::Write...

    半个小时学json(json传递示例)

    本文档主要介绍如何在半小时内学习使用JSON进行数据传递,包括一维数组与二维数组的传递示例。 一维数组传递示例 在示例中,首先利用JavaScript中的jQuery库来实现异步请求,通过$.getJSON方法向服务器端发送请求,...

    perl经典教程

    - 二维数组用数组引用表示,如`$array_ref = [\@array1, \@array2]`。 - 数组函数包括`pop`、`push`、`shift`和`unshift`,分别用于操作数组的末尾和开头。 - `splice`函数用于在数组中间插入、删除或替换元素。 ...

Global site tag (gtag.js) - Google Analytics