当前位置:编程学习 > 网站相关 >>

Learning Perl 7

 

 1. 数组的长度

$#arrayname返回数组最后一个长度的下标。( 默认数组是从0下标开始)

2. 数组的切片Array slicing

从一个数组给另一个数组的元素赋值时,得出的数组称为数组片。如果右边的数组大于左边的数组时,未使用的值将放弃。如果小于,多出的左边的值将为undef。

例如:

@name = ('A','B','C');

@pal = @name[0,1];          #important! array slicing, using @name[...] instead of $name[...]

print @pal."@pal\n";

($pal[2], $pal[3]) = @name[2, 1];

print @pal."@pal\n";

令:

@part = ();

$x = 4;

for ($y = 7; $y < 13; $y++) {

push @part, $AoA[$x][$y];

}

这个循环其实可以用一个切片操作来代替:

 @part = @{ $AoA[4] } [ 7..12 ];

3. 二维数组

第一个下标代表行,第二个代表列。行是未命名的列表,即匿名列表。->运算符,又称中缀运算符可以用来获得数组的单个元素。

    @matrix = (

    [1, 2, 3],

    [4, 5, 6],

    [],

    []

);

 

print $matrix[0][1], $matrix[1]->[1]."\n";    #写法作用相同

$matrix[2][2]=<STDIN>;

print $matrix[2]->[2]."\n";

my $i = scalar @{$matrix[0]};

一个指向数组的引用:

 # 一个指向“包含有数组引用的数组”的引用

        $ref_to_AoA = [

            [ "fred", "barney", "pebbles", "bambam", "dino", ],

            [ "homer", "bart", "marge", "maggie", ],

            [ "george", "jane", "elroy", "judy", ],

        ];

        print $ref_to_AoA->[2][2];

与C语言不同,perl中不能随意变换数组和引用。所以访问方式不一样!

让我们试着从一个文件中读取二维数组。首先我们演示如何一次性添加一行。首先我们假设有这样一个文本文件:每一行代表了二维数组的行,而每一个单词代表了二维数组的一个元素。下面的代码可以把它们储存到@AoA: 

while (<>) {

@tmp = split;

push @AoA, [ @tmp ];

}

当然,你也可以不要临时变量:

while (<>) {push @AoA, [ split ];}

如果你知道想要放在什么地方的话,你也可以不要push(),而是直接进行赋值:

my (@AoA, $i, $line);

for $i ( 0 .. 10 ) {

$line = <>;

$AoA[$i] = [ split ' ', $line ];

}

你可能生怕<> 在列表上下文会出差错,所以想要明确地声明要在标量上下文中对<> 求值,这样可读性会更好一些: (译者注:列表上下文中,<>返回所有的行,标量上下文中<> 只返回一行。)

my (@AoA, $i);

for $i ( 0 .. 10 ) {

$AoA[$i] = [ split ' ', scalar(<>) ];

      }

如果你想用$ref_to_AoA 这样的一个引用来代替数组,那你就得这么写:

      while (<>) {

         push @$ref_to_AoA, [ split ];

}

打印整个数组:不支持对引用的自动展开print运算。需要以此迭代输出:

for $aref ( @AoA ) {

            print "\t [ @$aref ],\n";

}

或者

for $i ( 0 .. $#AoA ) {

            print "\t elt $i is [ @{$AoA[$i]} ],\n";

}

二重循环输出:

for $i ( 0 .. $#AoA ) {

            $aref = $AoA[$i];

            for $j ( 0 .. $#{$aref} ) {

                print "elt $i $j is $AoA[$i][$j]\n";

            }

        }

    哦,好像还有点复杂,那么试试这样:

       for $i ( 0 .. $#AoA ) {

            $aref = $AoA[$i];

            $n = @$aref - 1;

            for $j ( 0 .. $n ) {

                print "elt $i $j is $AoA[$i][$j]\n";

            }

        }

 

4. 散列的分片

@info = qw(Marine Captain 50000);

@officer{‘BRANCH’, ‘TITLE’, ‘SALARY’} = @info;

散列的散列

anonymous hashs in a hash

%students=(Math => {Joe => 100, Joan => 95}, Science => {Bill => 85}, Dan => 76);

获得散列中的匿名散列的元素

$students{Math}->{Joan}

获得整个匿名散列

%{$students{Math}}

anonymous arrays in a hash

%grades=(

Math => [89,90],

English => [79,69]

);

$grades{Math}[1];

$grades{Math}->[1];

 

@{$grades{English}}the anonymous array

散列的数组

@stores=(

    {Boss=>”Ari Goldberg”,

    Registers=>10

},

    {Boss=>”Amy Goldberg”,

    Registers=>5

});

the numbers of element in the array is $#array+1

for($i=0; $i<$#sores+1; $i++){

    print $stores[$i]->{“Boss”};

    …

    print ‘___’x 20, “\n”

}

5. 输入函数

(1). <STDIN>

列表上下文下,每一行将作为列表中的一项。使用EOF结束(UNIX ctrl+D)

@all=<STDIN>

(2).read函数

read函数用于从规定的文件句柄将字节数读到变量中。返回读取到得字节数。如果从标准输入读取,文件句柄为STDIN。

$number = read(STDIN, $favorite, 10);

# if the input string less than 10 chars, press ctrl + D to end.<

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,