perl笔记

来源:互联网 发布:怎么查淘宝买家信誉 编辑:程序博客网 时间:2024/05/22 00:22

/*

所有笔记都是根据个人对某知识点了解程度而做适当记录,以备复习。不是针对某知识点系统记录、讲解。

*/


1、last相当于break        next相当于continue


2、“真”的定义
    A、未定义的变量为false
    B、空字符创为false
    C、值为0为false
    D、其他情况为真
    
3、defined函数测试变量是否有某个值。

4、简单关系运算符
    ==        eq
    !=        ne
    <        lt
    <=        le
    >        gt
    >=        ge
    

5、十六进制表时必须用0x,而不能用0X。(x的大小写区别)

6、perl允许在数字中使用下划线 eg:1_333_258

7、在双引号中分离变量,可使用{}

8、perl运算符:
    .    字符串串联    eg: $full_name = $first." ".$last
    **    幂        eg: $div = 12**2
    x    重复        eg: $no = "no" x 3
    
9、open如果打开成功,返回true,否则返回undef

10、从文件读入空行时,读入的是\n,而不是“”

11、在线文档
    perldoc -f chomp
    perldoc -f defined
    perldoc perlsyn    #基本语法信息
    perldoc perllop #关于perl运算符的信息
    
12、决定数组中的元素个数:$#array
    注意注意:表达式$#array返回的是数组的最后元素的索引。对于单元素数组,$#array 返回0. 对于空数组,$#array返回-1.
    
    eg:for(my $index = 0; $index <= $#array; $index++); 使用 <= 而不是 <
    
13、带有“黑洞”的数组
    my @array = (1); $array[3] = 100;    
    @array元素为(1,undef,undef,100);

14、引用词常犯错误
    my @name = qw(xin lang shen zhen); #qw列表中不能有逗号
    
15、操纵数组结尾
    push(@array,1);            #数组结尾插入1
    $last_element = pop(@array);    #pop数组最后一元素
    
    $first_element = shit(@array);    #pop数组第一个元素
    unshit(@array,1);        #数组开头插入1元素

16、处理数组的一部分:
    A、使用一套索引:
        @array[0,$#array] = (-1,-1); #将数组的第一个元素和最后一个元素赋值为-1
        @array = qw(1 2 3 4); @new_array = @array[0,3];#@new_array 元素为1、4
    
    B、范围运算符:
        @array[0..9] = ((0) x 10); #@array头10个元素被赋值为0
        
17、splice函数
    A、splice @array, $offset;    #删除数组中元素,从offset开始一直到数组结尾,如果 $offset 为负数,则从数组末尾开始数元素
    B、splice @array, $offset, $length;    #length 为删除的数组个数
    C、splice @array, $offset, $length, REPLACEMENTS; #REPLACEMENTS可以是标量列表或者是数组表达式

18、split函数
    my $record = "xin:lang:love:shen:zhen";
    my @split = split /:/,$record;    #以 : 分割 $record    采用//是因为它是一个正则表达式
    结果为:@split = qw(xin lang love shen zhen);

19、join 函数:作用与 split 相反:

    $result = join("***",@array);#将@array元素用***联合起来

20、正则表达式元素
    ^    匹配行的起始
    \s    匹配空白字符
    \d    匹配一个数字
    *?    重复0或多次,但尽少量的匹配
    
21、    perldoc perlre        perl关于正则表达式的在线文档
    perldoc perlop        perl的运算符(如s///运算)的文档
    perldoc perldebguts    关于perl内部的调试信息
    
22、    foreach $element (@array){}
    注意:$element实际上是一个对数组元素的引用,对$element的改变就是对@array的改变
    
23、文件测试运算符
    -f    是否为一个普通文件
    -r    文件可读
    -w    文件可写
    -x    文件可执行
    -d    文件为一个目录
    
    可用 perldoc -f -r 查询,即把文件测试运算符当函数

24、redo运算符
    读入一个名字列表,并将它们保存在一个数组中,如果用户输入空行,则重新输入。
    for(my $index = 1; $index < 10; $index++){
        print "Enter name number $index:";
        my $result = <STDIN>;
        chomp($result);
        
        #如果用户输入一个空行,则再给一次机会
        if($result eq ""){
            redo;
        }
        
        $name_list[$index-1] = $result;
    }

25、翻译运算符 tr
    $hex =~ tr/!@#/123/;
    如果 $hex 为Q!W@E#,则其结果为Q1W2E3.

26、unless 等价于 if not

27、__DATA__文件
    这个指令告诉perl后面的内容不是脚本的一部分,而是在脚本中用于数据的一个特殊位置,它可以使用<DATA>文件句柄按一个普通文件来读。
    eg:
    use strict;
    use warnings;
    while(<DATA>){
        print;
    }
    
    __DATA__
    Hello, I am doing a test.
    
    结果输出:Hello, I am doing a test.
    
28、<>文件定义:
    * 如果在 @ARGV 中有一个参数,则<>将每个参数当做一个文件名,并按顺序读入;
    * 如果 @ARGV 为空,则<>读取标准输入。
    
    eg:
    程序清单 Ques28.pl
    ----------------------------------
    use strict;
    use warnings;
    
    my $line;
    while($line = <>){
        print $line;
    }
    ----------------------------------
    然后按下面指令来运行:perl Quse28.pl test1.txt test2.txt
    结果:将test1.txt test2.txt两个脚本的内容输出

=====================散列、引用和复杂数据结构==================

29、散列初始化之一:
    my %fix_words = (
        beleive => "believe",
        admimstration => "administration",
        skool => "school"
    );

30、遍历散列
    foreach my $cur_key(sort keys %fix_words){
        print "$cur_key:$fix_words{$cur_key}\n";
    }

31、
    ================code start================
    use strict;
    use warnings;
    
    my @array = qw!xin ling ye wu!;
    my %my_hash;
    %my_hash = map +($_ => 1),@array;
    foreach (sort keys %my_hash){
        print "$_ => $my_hash{$_}\n";
    }
    ================code end==================
    解析:    map函数一般形式:
        map expression,array;#对array中的每个元素进行expression操作
        为什么 map后面出现 +(加号)?,这是告诉 map,其有两个参数,分别为$_ => 1 和 @array,否则map将误认为自己只有一个参数,即 $_ => 1.其他的自己琢磨
    
32、散列元素删除
    delete $hash{$key};

33、散列和数组可以相互赋值
    my %hash =(
        sam => 45,
        joe => 57,
        mac => 68
    );
    
    my @array = %hash;
    @array 元素为sam 45 joe 57 mac 68.注意:顺序可能不一样,因为在散列中没有定义键顺序。
    
34、引用(用反斜杠表示 \)
    my $var = 1;
    my $ref = \$var;
    $$ref = 2;
    print $var;#值为2
    #注意:应用被引用的实际标量,需要再添加一个$,即$$ref。
    
    #数组引用:
    my @array = qw(red white blue);
    my $ref = \@array;
    $$ref[$#$ref];#最后一个元素

35、散列的引用
    ================= code start===============
    use strict;
    use warnings;
    my $ref = {xin=>23,ling=>24,ye=>28};
    print $$ref{xin};#注意两个$$
    ================= code end=================
36、数组的引用
    my @array = qw(xin lang shen zhen);

    $ref = [@array];#方括号用于创建一个数组的拷贝,并返回一个对它的引用
    $$ref[1] = "test";
    print "@array\n";#输出 xin lang shen zhen
    print $$ref[0]."\n";#xin
    print $$ref[1]."\n";#test
    print $$ref[2]."\n";#shen
    print $$ref[3]."\n";#zhen
    
    ###############################3
    
    $ref = \@array;
    $$ref[1] = "test";#对array的完全引用
    print @array;#xin test shen zhen
    
    my $ref = ["red","white","black"];#匿名引用的其他方法

37、散列放到数组里
    my @hash_array;
    $hash_array[0] = {xin=>24,ling=>25};
    $hash_array[1] = {shenzhen=>perfect,guangzhou=>good};
    
    print $hash_array[0]{xin};    #24
    print $hash_array[1]{guangzhou};#good

38、打印复杂数据结构
    require "dumpvar.pl"#放在程序顶部的附近,放在use行后面
    dumoValue(reference);#调用,如dumpValue(\@array);
    
    ================= code start===============
    use strict;
    use warnings;
    require "dumpvar.pl";
    
    my @matrix = (
        [qw(xin lang)],
        [qw(ling xi mei)],
        [qw(live in shen zhen ping zhou)]
    );
    
    dumpValue(\@matrix);
    ================= code end=================
    result:
    0  ARRAY(0x85de1c)
       0  'xin'
       1  'lang'
    1  ARRAY(0x85de8c)
       0  'ling'
       1  'xi'
       2  'mei'
    2  ARRAY(0x1d28f34)
       0  'live'
       1  'in'
       2  'shen'
       3  'zhen'
       4  'ping'
       5  'zhou'

39、code test
    ================= code start===============
    use strict;
    use warnings;
    require "dumpvar.pl";
    
    my @matrix = (
        [qw(xin lang work in zhong ruan guo ji)],
        [qw(ling xi mei)],
        [qw(live in shen zhen ping zhou)],
    );
    
    print '$#matrix:'.$#matrix."\n";        #行数    
    print '$#{matrix[0]}:'.$#{$matrix[0]}."\n";    #列数
    print '$#{matrix[1]}:'.$#{$matrix[1]}."\n";
    print '$#{matrix[2]}:'.$#{$matrix[2]}."\n";
    ================= code end=================
    result:
    $#matrix:2
    $#{matrix[0]}:7
    $#{matrix[1]}:2
    $#{matrix[2]}:5

40、my @new_array = @old_array;#引用被复制,而数据没被复制,对@new_array的修改就是对@old_array修改

    考虑使用 Storable 模块,函数 dclone 克隆一个复杂的数据结构,生成一个所有引用的拷贝。它带有一个参数,一个对即将克隆数据的引用,并返回一个对数据拷贝的引用。
    ================= code start===============
    use strict;
    use warnings;
    require "dumpvar.pl";
    
    use Storable qw(dclone);
    
    my @old_array = qw(hua wei in shen zhen);
    my $new_array_ref = dclone(\@old_array);
    print "@old_array\n";
    dumpValue($new_array_ref);
    ================= code end=================
    result:
    hua wei in shen zhen
    0  'hua'
    1  'wei'
    2  'in'
    3  'shen'
    4  'zhen'

41、在线文档
    perldoc perdata #关于perl数据结构的信息

    模块:
    Storable #保存和从文件读取复杂数据结构的perl模块
    dumpvar.pl #一个用于倾倒变量未编进文档的模块

=====================子程序和模块==================
42、参数定义字符
    $    标量
    \@    数组(转换成引用)
    \%    散列(转换成引用)
    &    函数引用
    @    数组(必须为最后一个)
    %    散列(必须为最后一个)
    ;    表示后面是可选参数

43、其他参数传递方法
    sub distance($$$$){
        my ($x1,$x2,$x3,$x4) = @_;
    }
    
    无参数定义的函数:如sub do_it{},这告诉perl函数带有任何类型的任何数量的参数。换句话说,绝对不进行类型检查。也没有数组到数组引用或散列到散列引用的自动转换发生,所有参数都被串联到一起,倾倒入@_.避免使用这种形式的参数传递。

44、local声明的作用:
    @@@:保存变量的全局定义
    @@@:允许你随意改变变量
    @@@:当局部变量越出作用域时,它就恢复全局定义
    
    my才是创建局部变量,local不是。
    ================= code start===============
    print "$#ARGV arguments present\n";
    {
        local @ARGV;
        my $first = shift @ARGV;
        print "$#ARGV arguments present now\n";
    }
    print "$#ARGV arguments restored\n";
    ================= code end=================
    等价于:
    ================= code start===============
    print "$#ARGV arguments present\n";
    my @save_argv = @ARGV;
    {
        my $first = shift @ARGV;
        print "$#ARGV arguments present now\n";
    }
    @ARGV = @save_argv;
    print "$#ARGV arguments restored\n";
    ================= code end=================

0 0
原创粉丝点击