• perl学习笔记二


    数组:

    特殊的数组索引:加入对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大,只要有可用的内存分配给数组。意外增加的数组元素的值为undef.

    $a[0]="aa";

    $a[1]="bb";

    $a[900]="99";

    有时需要找出数组中最后一个元素的索引值,如对数组rocks而言。其最后一个元素的索引值为$#rocks,元素个数$#rocks+1。

    数组最后一个元素也可以用#rokcs[-1]访问。-1表示倒数第一的意思。

    列表直接量:

    qw(quoted word)简写

    如:qw(fred barney betty wilma dino)="fred","barney","betty","wilma","dino"

    因为qw算是一种引用的形式,所以不能将将注释写在qw中。

    有时人们喜欢每个元素单独成行,便于查看和增删:

    qw(

      fred

      barney

      betty

      wilma

      dino

    )

    前面的例子是以()作为界定符,其实perl还允许以其他的标点符号作为界定符。常用的写法为:

    qw| fred barney betty wilma dino |

    qw# fred barney betty wilma dino #

    qw/  fred barney betty wilma dino /

     

    链表的赋值:

    ($fred,$barney,$dino)=("flintstone","rubble",undef);

    交换两个的值:($fred,$barney)=($barney,$fred)

    赋值左边少于右边:($fred,$barney)=qw< flintstone rubble slate granite>;#忽略掉末尾两个元素

    赋值 左边多于右边:($wilma,$dino)=qw[ flintstone];#$dino的值为undef

    @(at)字符(近似定义数组):

     

    注意:@giant=1..5;==@giant=qw/ 1 2 3 4 5/;

    @copy=@quarry;是将quarrry中的数据全部拷贝到copy中,不是和C语言中指针一样,两者指向同一块空间。

    push 和 pop操作符(处理数组的尾端,即把数组当作一个栈来用):

    pop沒什么好说的,注意一下:pop @array;==pop (@array);就行

    push 有沒什么好说的,注意:push @array,1..10向array中添加10个元素。和pop一样,push也可以拿掉括号。

    shift 和unshift操作(处理数组的首端,即把数组当作一个队列来用):

    类似pop和push操作,不细数了。

    splice操作(添加或者移除数组中的某些值):

    pop-push和shift-unshift操作符都是针对数组的尾部进行的操作,splice则是对数组的中间进行操作。

    splice有四个操作符号,他最多可以接受四个参数(最后两个是可选的):

    第一个为要操作的目标数组,第二个参数为操作的数组中的元素哦开始位置;

    如果仅仅是这两个参数,Perl会把即定位置到末尾的元素全部取出来并且返回。

     

    第三个参数为指定要操作的元素长度,

    第四个参数是要替换的列表。之前我们看到的都是如何实现从数组中拿走元素,此时就可以补充新元素到数组中。

     

    将第三个参数的值设置为0即可不删除地添加新的列表。

     

    注意新插入元素的位置。

    字符串中数组的内插:

    简单例子:

     

    需要注意的:写邮箱地址时用$email=”fred@bedrock.edu”//错误,可以写成$email=”fred@bedrock.edu”.

    另外一个需要注意的地方是:

    如果需要在某一标量变量的后面接着写左方括号,则需要先将该方括号隔开,它才不至于为数组引用的一部分。如下:

     

    foreach控制结构

    #!D:Perlinperl
    @rocks = qw / bedrocks slate Java /;
    foreach $tmp(@rocks) {
        print "ont rock is $tmp
    ";
    }

    注意:控制变量并非是列表元素的复制品——实际上,他就是列表元素本身。如果在循环中修改了控制变量的值时那么列表的值也将修改。如下:

    #!D:Perlinperl
    @rocks = qw / bedrocks slate Java /;
    foreach $tmp(@rocks) {
        if ($tmp eq "slate" ) {
            $tmp="slate222222";
        }
    }
    foreach $tmp (@rocks) {
        print "$tmp
    ";
    }

    注意:同时控制变量再循环结束后会回到循环前面的值,如下:

    #!D:Perlinperl
    $tmp='tmp';
    @rocks = qw / bedrocks slate Java /;
    foreach $tmp(@rocks) {
        print "tmp is $tmp.
    "
    }
    print "FINAL::tmp is $tmp.
    "

    执行结果:

    重要的默认变量:$_

    如果在foreach循环开头省略控制变量,Perl就会用$_(在很多情况下当未告知Perl使用那一个变量或者数值时,Perl都会使用$_)。如下:

    #!/usr/bin/perl
    use strict;
    use warnings;
    foreach  (1..10) {
        print " $_ ";
    }

    revers操作符

    reverse操作符读取列表中的值并按照相反的次序返回列表。

    如:@wilma=reverse 6..10;

    注意:如果要改变@fred的值的话需要使用:@fred=reverse @fred;

    sort操作符

    读取列表中元素的值并按照一定的顺序输出。

    #!D:Perlinperl
    use strict;
    my @imple=qw/ bed slate rubble grantie/;
    my @sor= sort (@imple);
    print "@sor 
    ";
    my @rev = reverse sort (@imple);
    print "@rev 
    ";
    
    my @numbers=sort 91..102;
    print "@numbers 
    "

    仔细看本例中的执行结果,注意数字的输出情况。reverse sort 方法值得掌握。

    注意:当使用use strict(强制程序员在使用变量前声明变量)时,变量定义前加一个my。

    each 操作符

    调用each可以返回数组中写一个元素所对应的两个值——元素的索引和值。

    #!/usr/bin/perl
    
    use warnings;
    @rocks=qw /bed slate rubble grantie/;
    while (($index,$value)=each @rocks) {
        print "$index :$value
    ";
    }

    标量上下文和列表上下文

    这部分好像很难,主要看自己的开发经验。

    在标量上下文中是i用产生列表的表达式

    在列表上下问中使用产生标量的表达式

    强制指定标量上下文

    使用伪函数scalar。

    列表上下文中<STDIN>

    @lines=<STDIN>;

    从键盘读取数据,每次读入一行(会将换行符也读进去),然后赋值给一个元素。结束标志:linux中是CTL+D windows中CTL+Z。

    在一般的使用中,会利用chomp(@lines=<STDIN>);将读入的每一行末尾的换行符号去掉。

  • 相关阅读:
    Lyft Level 5 Challenge 2018
    Codeforces Round #514 (Div. 2)题解
    Bubble Cup 11
    不如来搞一下CDQ分治吧!
    Codeforces Round #331 (Div. 2)
    写一下中国剩余定理的证明
    codeforces Round#332Div2 题解
    GCPC2017 题解
    2017 USP Try-outs 题解
    CodeForce 387D. George and Interesting Graph
  • 原文地址:https://www.cnblogs.com/lukexwang/p/4629001.html
Copyright © 2020-2023  润新知