Day Vision

Reading Everyday,Extending Vision

Perl语言学习(二)Perl数据类型

2022-09-16 06:22:06


可以包含任意多个元素,从0到全部占满内存数组以@符号作为标识image.png列表直接量:包含了一系列值的列表,以括号标识,中间用逗号隔开image.png也可以用范围操作符".."来产生列表直接量:该操作符会从左边的数字计数到右边,每次加


1、Perl数据类型之标量

  • 标量:Scalar,以$符号开头
    • 数字标量:
      • 值为”数字“的标量
      • Perl中的数字
        • 全部为双精度浮点数:$data = 10; $data = 10.00;
        • 普通放入表示方法:3.1415926,-500等
        • 科学计数法:2.18e22,2.18E22,5.16e-10
        • 特殊数字的表示方法:较长的、不带小数点的数字,可用下划线分开;非十进制数
  • 字符串标量:
    • 标量值为字符串,由引号标识
    • 字符串由可输出的字母、数字和标点符号组成,如$data = “Hellow, World"
    • 字符串的引号既可以是单引号,也可以是双引号,可灵活使用
    • 单引号与双引号表示的区别:转义符只在双引号中有效
  • 标量的声明
    • 标量可以在任意位置随时声明并使用,标量的默认初始值为空
    • 标量名可以是字符、数字或者下划线,区分大小写,取名应和用途相关
  • 标量的作用域
    • 标量的作用域指的是一个标量可以被有效访问使用的范围
    • 两种标量的作用域范围:
      • 包变量(全局的)
        • Perl中一个package是一个包,主函数也可以看做一个包
        • 默认情况下的变量为包变量,是包内的全局变量,在整个包及下面的子函数中都可用
      • 私有标量
        • 分为my类型和local类型
        • my变量:只在本层模块中可以看到这个变量
        • local变量:在本层及本层下层的函数中都可以看到的变量
      • sub g_print{
            print "$x\n";
        }
        sub test_my{
            my $x = 11;
            print "call-my $x\n";
            g_print;
        }
        sub test_local{
            local $x = 20;
            print "call-local $x\n";
            g_print;
        }
        
        $x = 9;
        test_my;
        test_local;
        print $x;
        
        # 运行结果
        call-my 11
        9
        call-local 20
        20
        9
        

2、Perl数据类型之数组

  • 数组的定义

    • 数组是标量数据的有序列表,是多个标量数据的一个集合。可以包含任意多个元素,从0到全部占满内存

    • 数组以@符号作为标识


      image.png
    • 列表直接量:

      • 包含了一系列值的列表,以括号标识,中间用逗号隔开


        image.png
      • 也可以用范围操作符".."来产生列表直接量:

        • 该操作符会从左边的数字计数到右边,每次加1,产生一连串的数字


          image.png
  • 数组的赋值

    • 对于纯字符串的列表,使用“qw”来表示,可省略对字符串加引号的过程
    • 形式为:
      • qw(string1 string2 string3); ##空格、制表符、换行符作为分隔符
      • 等同于("string1","string2","string3");
      • 也可用其他任何标点符号作为定界符,代替括号
      • qw !string1 string2 string3! qw /string1 string2 string3/ qw #string1 string2 string3#
    • 对数组进行赋值,可以直接将列表量传递给数组
      • @array = ("string1", 1.5, 418); @array = qw(string1 string2 string3);
      • 如果列表直接量中包含标量、数组,则会进行取值作为元素
      • $test = "hello"; @array = ("hello", 123); @array2 = ($test, @arrray1, "How are you")
    • 数组之间进行赋值:
      • @array1 = ('string1', 1.5, 418); @array2 = @array1;
    • 特殊的数组赋值方法:
      • pop操作符:取出数组中最后一个元素,同时返回该元素值
        • @array = (5..9); ##@array为(5,6,7,8,9)
        • $test1 = pop(@array); ##$test1为9,@array为(5,6,7,8)
        • $test2 = pop(@array); ##$test2为8,@array为(5,6,7)
      • push操作符:添加一个元素(或一串元素)到数组的尾端
        • @array = (5,6);
        • push(@array,8); ##@array为(5,6,8)
        • push(@array,1..5); ##@array为(5,6,8,1,2,3,4,5)
      • shift操作符:取出数组最左边的元素,同时返回该元素值
        • @array = (5..9); ##@array为(5,6,7,8,9)
        • $test1 = shift(@array); ##$test1为5,@array为(6,7,8,9)
        • $test2 = shift(@array); ##$test2为6,@array为(7,8,9)
      • unshift操作符:添加一个元素(或一串元素)到数组的前端
        • @array= (5,6)
        • unshift(@array,8) ##@array为(8,5,6)
        • unshift(@array,1..5) ##@array为(1,2,3,4,5,8,5,6)
  • 数组元素的访问

    • 通过索引对数组元素进行访问:
      • @array = ("hello","world",123)
      • $array[0]="hello"; $array[1]="world"; $array[2] = 123;
      • 同标量$array没有任何关系
    • 特殊索引值:
      • 用$#<数组名>代表最后一个元素的索引值。$end=$#array
      • 使用负数索引。
        • $array[-1]代表最后一个元素值
        • $array[-2]代表倒数第二个元素值

3、Perl数据类型之引用

  • 引用作为一种数据变量,可以指向变量、数组甚至子程序,代表值的地址

  • 在Perl中,可以把引用称为指针,二者是通用、无差别的

  • 变量、变量名、地址


    image.png
  • 软引用:

    • 软引用类似于软连接,存储一个变量的名字
      • $scalar = "hello";
      • @scalar = ("hello","world",123);
      • $refer = "scalar"; ##引用变量名
    • 软引用的解引用
      • $$refer ##实质为$scalar,即为“Hello“
      • $$refer[0] ##实质为$scalar[0]
  • 硬引用:

    • 硬引用类似于硬连接,就是存储地址
      • $scalarref = \$foo; ##标量引用,$foo = "hello";
      • $constref = \186_282.42; ##常量引用
      • $arrayref = \@arr; ##数组引用,@arr= 1..100;
      • $arrRef = [1,2,3,4,5]; ##匿名数组的引用
    • 硬引用的解引用
      • 由于硬引用是地址,所以用{}来进行解引用
      • $scalarref = \$foo; ==> ${$scalarref}, 简写为$$scalarref
      • $constref = \186_282.42; ==> ${$constref}, 简写为$$constref
      • $arrayref = \@arr; ==> ${$arrayref}
      • $arrRef = [1,2,3,4,5]; ==> ${$arrRef}
  • 引用有助于创建复杂的数据

    • @array = ([1..5],"hello world")
    • ${$array[0]}{0} ##值为1
my $scalar = "Hello";
my @array = ("Hello","World",123);
my $scal_ref = \$scalar;
my $arr_ref = \@array;
## compare
my $scalar_com = $scalar;
my $array_0 = $array[0];

printf("scalar value:$$scal_ref\n");
printf("array0 value:$($arr_ref)[0]\n");

## modify the value
$$scal_ref = "Hello2";
$($arr_ref)[0] = "Hello2";

$scalar_com = "Hello3";
$array_0 = "Hellow3";

printf("scalar value: $scalar\n");
printf("array0 value: $array[0]\n");

# 输出结果
scalar value:Hello
array0 value:Hello
scalar value: Hello2
array0 value: Hello2

参考来源: https://www.jikexueyuan.com/course/901.html