zoukankan      html  css  js  c++  java
  • Perl学习笔记(三)--列表与数组

    列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。

    访问数组中的元素

    数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1,如:

    $fred[0]="yabba";
    
    $fred[1]="dabba";
    
    $fred[2]="doo";
    

     当然,任何求值能得到数字的表达式都可以用作下标,如果不是整数,会自动舍去小数,无论正负:                 

    print $fred[2.71828-1];     #等同于print $fred[1]
    

     假如下标超出数组尾端,对应的值是undef

    特殊的数组索引值

    数组rocks的最后一个元素的索引值是$#rocks,如$rocks[$#rocks];

    负数表示倒数,因此$rocks[-1]等同于$rocks[$#rocks]


    列表直接量:

    列表直接量(list literal,也就是在程序代码中表示一列数据的写法),可以由圆括号内用逗号隔开的一串数据表示,而这些数据就称为列表元素,如

    (1,2,3)
    ("fred",4.5)
    (1..5)       #范围操作符..,从左边的数字计数到右边,每次加1,等同于(1,2,3,4,5),只能从小到大累加
    ($m..$n)   #数组中的元素可以是表达式
    


    qw简写

    perl会将其当成单引号内的字符串来处理,其中的空白字符会被抛弃,剩下的是列表元素,如

    qw(fred barney      betty whilma)
    

     
    perl允许用任何标点符号作为定界符,如下

            qw! fred barney betty whilma !
            qw/ fred barney betty whilma /
            qw# fred barney betty whilma #
    

     
    列表的赋值

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

     互换变量的值

    ($fred,$barney)=($barney,$fred);    #交换着两个变量的值
    

     数组的简写:在数组名之前加上@
     

    构建一个字符串数组:

    @rocks=qw/ bedrock slate lava/;
    
    @copy=@quarry;  #将一个数组中的列表复制到另一个数组
    


    pop和push操作符:

    pop操作符可以用来取出数组中最后一个元素,同时返回该元素值。如果数组是空的,直接返回undef。

    @array=5..9;
    $fred =pop(@array);    #$fred变成9,@array现在是(5,6,7,8)
    $fred=pop @array;      #也可以不加括号这样写,@array现在是(5,6,7)
    pop @array;      #@array现在是(5,6),7被抛弃了
       
    

     push操作符用于添加一个元素(或是一串元素)到数组的尾端

    push(@array,0);       #@array现在是(5,6,0)
    push @array,8;        #@array现在是(5,6,0,8)
    push @array,1..10;     #@array得到了10个新元素 
    

     注意:push的第一个参数或者pop的唯一参数都必须是要操作的数组变量—对列表直接进行push或者pop操作是没有意义的。


    shift和unshift操作符:

    与pop和push类似,不过是针对数组开头的元素

    @array = qw[dino fred barney];
    $m = shift(@array);      #$m变成dino,@array现在是(”fred”,”barney”)

     与pop类似,对于一个空的数组变量,shift会返回undef

     

    字符串中的数组内插

    和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组各个元素之间自动添加空格,但首尾不会增添额外空格,如

    print "quartz @rocks limestone
    ";
    

      为了避免@歧义,可以使用转义字符或用单引号字符串
     也可以内插数组的某个元素

     $x="this is $fred[1]'s place";
    

     
    foreach控制结构

    能逐项遍历列表中的值,依次迭代

    foreach $rock (qw/bedrock slate lava/){
     print "One rock is $rock.
    ";
     }    
    

      

    Perl最喜欢用的默认变量:$_

    假如在foreach循环的开头省略控制变量,perl就会用默认变量$_

    foreach (1..10){
     print "I can count to $_!
    ";
     }
    

     

    在许多情况下,当未告知perl使用哪个变量或数值时,perl就会自动使用$_

    foreach (1..10){
     print ;  #直接打印12345678910
     }
    


    reverse操作符:

    读取列表的值,并按相反的次序返回该列表

    @fred = 6..10;
    @barney = reverse(@fred) #10,9,8,7,6
    @fred = reverse @fred;
    

     

    sort操作符:

    读取列表的值,并根据内部的字符编码顺序进行排序(注意对数字排序可能出错,因为当字符串处理了),  如

    @rocks= sort @rocks;
    

     
    标量上下文与列表上下文:

    在perl解析表达式的时候,要么希望得到一个标量,要么希望得到一个列表

    表达式所在的位置,perl期望得到什么,那就是该表达式的上下文
    在标量上下文中使用产生列表的表达式:
     

    @back= reverse qw/yabba dabba doo/;#会变成doo,dabba,yabba
     $back= reverse qw/yabba dabba doo/;#会变成oodabbadabbay
    

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

    很简单,如果表达式求值结果为标量值,自动产生一个仅含此标量值的列表

    清空列表可以使用@betty=();注意不是undef


    强制指定标量上下文

    使用伪函数scalar,如

    print "I have ", scalar @rocks,"rocks!
    ";   # 此时@rocks返回数组个数    
    

     

    列表上下文中的<STDIN>:

    返回所有剩下的行,直到文件结尾,返回的每一行都会成为列表中的某个元素

    @lines=<STDIN>;
    

     此时也可用chomp去掉每一行的换行符chomp(@lines);

    更常见的是

    chomp(@lines=<STDIN>);
    

    练习:

    1. 写一个程序,读入一些字符串(每行一个),直到文件结尾为止。然后,再以相反顺序输入这个列表。假如输入来自键盘,你需要在Unix系统上键入Ctrl+D或在Windows系统上键入Ctrl+Z然后回车来表示输入的结束。

    print reverse <STDIN>;
    

    2.  写一个程序,读入一些数字(每行一个),直到文件结尾为止。然后,根据每一个数字输出如下名单中相应的人名。比方说,如果输入的数字是1,、2、4和2.那么输出的人名将会是fred、betty、dino和betty

    my @name =(fred,betty,san,dino,ddee,erwre,werew);
    
    chomp(@array = <STDIN>);
    
    foreach(@array){
    
             my $num=$_;
    
             my $n=$num-1;
    
    print "$name[$n]
    ";
    
    }
    
  • 相关阅读:
    查找代码中的中文
    C# 清除cookies
    C# 32位程序在64位系统下注册表操作
    C# 32位程序在64位系统下运行中解决重定向问题
    C# 把一个文件夹下所有文件删除
    C# 把一个文件夹下所有文件复制到另一个文件夹下
    chromium浏览器开发系列第五篇:Debugging with WinDBG
    chromium浏览器开发系列第四篇:如何调试最新chromium源码
    chromium浏览器开发系列第三篇:chromium源码目录结构
    chromium浏览器高级开发系列第二篇:如何编译最新chromium源码
  • 原文地址:https://www.cnblogs.com/Hebe/p/3711697.html
Copyright © 2011-2022 走看看