perl-数据类型

下一篇:perl-操作表达(运算符,条件表达,循环)

学习记录

学习perl脚本有一段时间了,整理下perl的基础语法,以后忘记了,再回来看。

关于perl执行,注释,打印警告,编程习惯约定

使用命令行执行:

perl -w -e 'print("hello, world\n")' 
# -e 执行perl代码
# -w 输出警告(如果有错误)
# 单引号:按照原样输出,双引号:转移输出(\n,被转义成换行),如果没有转义,那双引号和单引号是一样的

使用脚本执行:以下是一些编程习惯

默认以pl结尾表示perl脚本
执行 perl test.pl

#!/usr/bin/perl -w
# use strict;
# use diagnostics;
print("hello, world\n");
# #号是注释
# print默认带括号,每一行默认带分号(perl比较灵活,没有分号也行)
# 默认使用双引号表示字符串
# 对于初学者,建议加上use strict(初略)或者use diagnostics(详细),打印错误信息(避免拼写错误,限定变量作用域),便于分析debug

使用帮助文档:

perldoc -f print
# 使用perldoc来查询内建函数的使用,包括一些例子

数据类型

perl中变量分为三种数据类型,以下介绍

标量

标量可以是数字perl强制将数字存储为双精度浮点数,所以不需要考虑数字的精度问题),字符串(加双引号),以$作为标量标识,以下是需要注意的地方

  • 举例:

    $first = 123;     # 数字标量123
    $second = "123";   # 字符串标量123 
    
  • 关于数字标量非十进制数表示

    进制 举例
    二进制,以0b开头 0b1111_1111,表示十进制255
    八进制,以0开头 0377,表示十进制的255
    十六进制,以0x开头 0xff(0xFF),表示十进制255
  • 关于标量申明,在perl中,可以在任何地方申明标量并使用(也可以不申明直接用,不建议这么写)

  • 关于标量的初始值,标量的初始值为空(null

  • 关于标量运算,数字变量操作(加减乘除),$a+$b, $a-$b, $a*$b, $a/$b, $a%$b ,字符串标量拼接,$a.$b

  • 关于标量的作用域分以下两种:
    – 包标量:包标量是包(package)内的全局标量在整个包以及下面的子函数都可以用
    – 私有标量:a. my型标量,只在本层模块可以看到这个表标量(本层调用的其他函数是看不到
    – 的),b. local型标量,在本层和本层下层的函数都可以看到的。同名标量下,私有类型的标量优先级高

    #!/usr/bin/perl -w
    
    sub g_print{
        print("g_test x: ", "$x\n");
    }
    sub test_my{
        my $x = 11;  # my私有变量,只在本模块使用
        print("call my x: ", "$x\n");
        g_print(); # 调用外部逻辑,属于本模块的下层模块,看不到本模块my私有变量
    }
    sub test_local{
        local $x = 20; # local私有变量,在本模块以及下层模块使用
        print("call local x: ", "$x\n");
        g_print(); # 调用外部逻辑,属于本模块的下层模块,能看到本模块local私有变量
    }
    $x = 9; #包变量
    test_my();
    test_local();
    print("x: ", "$x\n");
    
    # 结果:
    # g_test x: 9
    # call my x: 11
    # g_test x: 9
    # call local x: 20
    # g_test x: 20
    # x: 9
    

数组

perl 数组一个是存储标量值的列表集合变量,变量可以是不同类型,可以包含任意多个元素,以@符号作为数组标识,这里的数组指的是一维数组,以下是需要注意的地方

  • 举例:

    @val = (25, 30, 40);             
    @names = ("google", "runoob", "taobao");
    
  • 数组的下标从左到右以0开始,从右到左以-1开始,@val = () 表示空数组

  • 访问数组元素,下表取值和连续取值,非连续取值,跟很多脚本语言差不多

    #!/usr/bin/perl -w
    @val_0 = (25, 30, 40);
    # 单元素索引,访问数组中某一个元素,单个数组元素是标量,用的是标量符号
    $a = $val_0[0];
    print("\$val_0[0]: $val_0[0]\n"); # 25 \表示转义输出, 没法转义的按原样输出
    print("\$val_0[-1]: $val_0[-1]\n"); # 40,反向取值
    # 连续索引,访问的是数组,用的是数组符号
    @val_1 = @val_0[0..1];
    print("\@val_0: @val_0\n"); # 25,30 连续取值采用的是数组序列方式
    @val_2 = @val_0[0,1];
    print("\@val_2: @val_2\n"); # 25,30 非连续取值
    @val_3 = @val_0[2, 0..1];
    print("\@val_3: @val_3\n"); # 40, 25,30 这样写也行
    
  • 数组序列,用于数组初始化于数组切片,起始值 + .. + 结束值

    @val = (2..6); 
    print("@val\n"); # 表示(2,3,4,5,6)
    @val = (6..2);
    print("@val\n"); # 表示空数组
    @val = (6, 1..5, 2)
    print("@val\n"); # 表示(6,1,2,3,4,5,2)
    @var_abc = ('a'..'z');
    print("@var_abc\n");  # 输出 a 到 z
    
  • 数组赋值-纯字符串数组,

    # 使用qw标记,各元素以空格或多行来分开,省去了**对字符串加引号**的过程
    # 界定符用!,/,(),间隔符使用空格,换行
    @array = qw!这是 一个 数组!;
    @array = qw/这是 一个 数组/;
    @array = qw(这是 一个 数组);
    
    # 使用split(" ", $string)函数,将字符串分割为数组, 双引号中是以此为参照物分割
    $string = "Where There Is A Will There Is A Way";
    @array = split(" ", $string);
    print "$array[4]\n";
    # 反之使用join(" ", @array)函数,也可以将数组装换成字符串
    @array = ("Where", "There", "Is", "A", "Will", "There", "Is", "A", "Way");
    $string = join(" ", @array);
    
  • 数组赋值-其他

    # a.直接赋值
    @array = ("string", 1, 2, 1..5);
    @array = qw(string1, string2, string3);
    
    # b.混合赋值,如果数组包含标量,其他数组,则会进行取值作为元素
    # @array2 = ("hello", "world", 123, "how are you?");
    $test = "hello";
    @array1 = ("world", 123);  
    @array2 = ($test, @array1, "how are you?");
    
    # c.复制赋值, 复制表示的重新存储,区别于索引
    @array1 = ("string", 1, 2);
    @array2 = @array1;
    
    # 索引赋值, 单元素索引并修改,连续
    @array1 = ("string", 1, 2);
    $array1[0] = "hello"; 
    @array1[0..1] = ("hello", "world");
    
    # 替换赋值,使用splice(@array, offset, num, list)
    @nums = (1..20);
    print "替换前 - @nums\n"; 
    # 从第5个开始,替换5嗝元素,以21..25去替换
    splice(@nums, 5, 5, 21..25); 
    print "替换后 - @nums\n";
    
  • 数组添加和删除元素

    @sites = ("hello","world","123");
    $size = @sites; # 拿到数组大小
    # $val = pop(@array)操作,删掉数组中最后一个元素, 并返回这个删除值(当然也可以不要返回)
    $val = pop(@sites); 
    # #$val = shift(@array)操作,删掉数组开头元素,并返回这个删除值(当然也可以不要返回)
    $val = shift(@sites);
    # push(@array, list)操作,在数组末尾添加一个或者多个元素
    push(@sites, 1);
    push(@sites, 1..2);
    push(@sites, @val);
    # unshift(@array, list)操作,在数组开头添加一个或者多个元素
    unshift(@sites, 1);
    unshift(@sites, 1..2);
    unshift(@sites, @val);
    
  • 数组大小或长度

     # 数组大小指的是存储物理大小
     @sites = ("hello","world","123");
     $size = @sites; # #size = 3
     $sites[6] = "yes";
     $size = @sites; # #size = 7
     # 数组长度指的是最后一个数组的索引下标, 使用$#,不能有括号以及数组标志符@
     $index_max = $#sites; 
    

哈希

很多脚本语言都有键值对{key:val}这种数据结构,在perl语言中叫哈希,以%符号为前缀,以下举例

  • 实例

    #!/usr/bin/perl -w
    # 创建哈希,单双引号都可以
    %dict = ("ame", "lisa", "age", 25, "height", "180cm");
    print("\$dict{'name'}: $dict{'name'}\n");
    print("\$dict{'age'}: $dict{'age'}\n");
    print("\$dict{'height'}: $dict{'height'}\n");
    # 打印结果,注意打印用双引号打印,内部就只能用单引号,哈希表以{}来表示索引
    $dict{'name'}: lisa
    $dict{'age'}: 25
    $dict{'height'}: 180cm
    
  • 创建哈希以及访问元素

    # 除了实例中介绍的,一般用=>符号穿件键值对,比较直观
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    # 访问哈希元素格式:$dict{key}
    $name = $dict{"name"};
    
  • 读取哈希keys以及value

    # 使用keys函数返回哈希中所有键到列表
    # 2022/10/7更新,注意是返回到一个列表中,因此可以用foreach对哈希中键或者值进行单独循环
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    @key = keys(%dict);
    print("\@key: @key\n");
    # 打印结果
    @key: height age name
    
    # 使用values函数返回哈希中所有的对到列表
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    @value = values(%dict);
    print("\@value: @value\n");
    # 打印结果
    @value: 25 lisa 180cm
    
    # 对key和value进行循环
    foreach my $key (keys(%dict)) {
      my $value = $dict{$key};
      print "$key : $value\n";
    }
    
  • 哈希迭代

    # 使用each函数对哈希进行迭代,按顺序返回哈希中每一个键值对
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    while(($key, $value) = each(%dict)){
      print("key: $key, value: $value\n");
    }	
    
  • 哈希中添加或删除键值对

    # 哈希中是靠键值对来识别元素,添加或删除没有列表那么复杂
    # 添加键值对,也可以来修改键值对
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    $dict{"result"} = 100;
    $dict{"age"} = 18;
    print("\$dict{'result'}: $dict{'result'}\n");
    # 删除键值对,使用delet函数,删掉键值即可
    delete($dict{"result"});
    
  • 检查键值对是否存在

    # 在读取键值对之前,要判断下该键值对是否存在
    # 使用exists函数判断,返回一个布尔值
    %dict = ("ame" => "lisa", "age" => 25, "height" => "180cm");
    if(exists($dict{"result"})){
      print("存在result键");
    }
    else {
      print("不存在result键");
    }
    

结尾

参考:Perl 教程
参考:perl基础语法
参考书:perl在IC设计实践

你可能感兴趣的:(perl,perl,开发语言)