0%

脚本语言之Perl

本节简单记录perl脚本语言的学习过程。

Perl基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl 
#首行以 #! 开头的内容会被当成特殊行忽略掉,不会影响脚本正文。所以它看起来像注释,但它不是普通注释,而是“启动器指令”。
#这句加上才能使用./hello.pl成功运行,否则需要使用perl hello.pl来运行
#还需加上chmod 0755 hello.pl 修改文件权限

#print 也可以使用括号来输出字符串,以下两个语句输出相同的结果
print("hello world !!\n");
print "hello world !!\n";

print ("hello world !!\n"); #Perl 解释器不会关心有多少个空白
print("hello
world !!\n"); #但是如果空格和分行出现在字符串内,他会原样输出
print "\n";

print "=======perl输出字符串单引号和双引号区别=======\n";
#perl 输出字符串可以使用单引号和双引号
#Perl双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出
print "Hello, world\n"; # 双引号
print 'Hello, world\n'; # 单引号
print "\n\n";

print "=======Here 文档示意=======\n";
$a = 10;
$var = <<"EOF";
这是一个 Here 文档实例,使用双引号。
可以在这输入字符串和变量。
例如:a = $a
EOF
print "$var\n";

$var = <<'EOF';
这是一个 Here 文档实例,使用单引号。
例如:a = $a
EOF
print "$var\n";
#EOF在这里通俗讲就是一个标记
#他用来标记一段文字(一般都是多行的,省得编码麻烦,
#用"<<"加上一个标记就可以把一大段代码存入到一个变量中去了)
  • 运行结果:

    image-20260420162900398

Perl数据类型

  • Perl 有三个基本的数据类型:标量、数组、哈希。

  • 标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个 $,表示是标量

  • 数组变量以字符 @ 开头,索引从 0 开始。要访问数组的变量,可以使用美元符号($)+变量名,并指定下标来访问

  • 哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值。哈希变量以字符 % 开头。如果要访问哈希值,可以使用 $ + {key} 格式来访问

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    #!/usr/bin/perl 

    #标量
    print "===========标量相关===========\n";
    $myfirst = 123; #数字123
    $mysecond = "123"; #字符串123
    $mythird = 11.2e-23; #浮点数

    $var1 = 047; #八进制以0开始,等于十进制的39
    $var2 = 0x1f; #十六进制以0x开始,等于十进制的31

    print "$myfirst\n";
    print "$mysecond\n";
    print "$mythird\n";
    print "$var1\n";
    print "$var2\n";

    print "===========标量运算===========\n";
    $str = "hello" . "world"; # 字符串连接
    $num = 5 + 10; # 两数相加
    $mul = 4 * 5; # 两数相乘
    $mix = $str . $num; # 连接字符串和数字

    print "str = $str\n";
    print "num = $num\n";
    print "mul = $mul\n";
    print "mix = $mix\n";

    print "===========特殊字符===========\n";
    #__FILE__, __LINE__, 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名
    #但如果直接将其放入字符串中,Perl 解释器会将它们当成普通字符串处理,不会解析为特殊变量。
    print "文件名 ". __FILE__ . "\n";
    print "行号 " . __LINE__ ."\n";
    print "包名 " . __PACKAGE__ ."\n";
    print "__FILE__ __LINE__ __PACKAGE__\n";

    print "===========v字符串===========\n";
    #一个以 v 开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。
    $smile = v9786;
    $foo = v102.111.111;
    $martin = v77.97.114.116.105.110;

    print "smile = $smile\n";
    print "foo = $foo\n";
    print "martin = $martin\n";

    print "---------------------------------------\n\n";
    #数组
    print "===========数组相关===========\n";
    @arr = (1, 2, 3);
    print "@arr\n";
    print "$arr[0]\n";
    print "$arr[1]\n";
    print "$arr[2]\n";
    #负数从反向开始读取,-1为最后一个元素,-2为倒数第二个元素,以此类推
    print "$arr[-1]\n";
    print "$arr[-2]\n";
    print "$arr[-3]\n";
    print "数组大小: ",scalar @arr,"\n";

    #数组长度返回的是数组物理大小,而不是元素的个数,
    @array = (1,2,3);
    $array[50] = 4;

    $size = @array;
    $sizeActu = grep { defined } @array;
    $max_index = $#array; # $#array 的 # 不是注释符号,而是 Perl 的特殊写法,表示数组 array 的最后一个下标,也就是最大索引。

    print "数组大小: $size\n";
    print "实际元素个数: $sizeActu\n";
    print "最大索引: $max_index\n";

    #变量上下文
    print "===========变量上下文相关===========\n";
    #上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文。
    #Perl 解释器会根据上下文来决定变量的类型
    @names = ('google', 'runoob', 'taobao');

    @copy = @names; # 复制数组
    $size = @names; # 数组赋值给标量,返回数组元素个数

    print "名字为 : @copy\n";
    print "名字数为 : $size\n";

    print "===========数组序列号===========\n";
    @var_10 = (1..10);
    @var_20 = (10..20);
    @var_abc = ('a'..'z');

    print "@var_10\n"; # 输出 1 到 10
    print "@var_20\n"; # 输出 10 到 20
    print "@var_abc\n"; # 输出 a 到 z

    print "===========添加和删除数组元素===========\n";
    # 创建一个简单是数组
    @sites = ("google","runoob","taobao");
    $new_size = @sites ;
    print "1. \@sites = @sites\n"."原数组长度 :$new_size\n";
    # 在数组结尾添加一个元素
    $new_size = push(@sites, "baidu");
    print "2. \@sites = @sites\n"."新数组长度 :$new_size\n";

    # 在数组开头添加一个元素
    $new_size = unshift(@sites, "weibo");
    print "3. \@sites = @sites\n"."新数组长度 :$new_size\n";

    # 删除数组末尾的元素
    $new_byte = pop(@sites);
    print "4. \@sites = @sites\n"."弹出元素为 :$new_byte\n";

    # 移除数组开头的元素
    $new_byte = shift(@sites);
    print "5. \@sites = @sites\n"."弹出元素为 :$new_byte\n";

    print "===========切割数组===========\n";
    @sites = qw/google taobao runoob weibo qq facebook 网易/; #qw// 是 Perl 中的一个特殊语法,用于创建一个由空格分隔的字符串列表,并将其赋值给一个数组变量。它的作用是简化字符串列表的创建,避免了使用引号和逗号的麻烦。
    @sites2 = @sites[3,4,5];
    print "@sites2\n";

    #如果是连续的索引,可以使用 .. 来表示指定范围:
    @sites2 = @sites[2..6];
    print "@sites2\n";

    print "===========替换数组元素===========\n";
    #Perl 中数组元素替换使用 splice() 函数,splice() 函数可以在数组中删除指定位置的元素,并在该位置插入新的元素。其语法如下:
    #splice(@array, offset, length, list)
    #其中,@array 是要操作的数组,offset 是要删除或替换的元素的起始位置,length 是要删除的元素数量,list 是要插入的新元素列表。
    @nums = (1..20);
    print "替换前 - @nums\n";
    #从第6个元素开始替换数组中的5个元素,替换为21到25的数字
    splice(@nums, 5, 5, 21..25);
    print "替换后 - @nums\n";

    print "===========将字符串转换为数组===========\n";
    #Perl 中将字符串转换为数组使用 split() 函数,split() 函数可以根据指定的分隔符将字符串分割成一个数组。其语法如下:
    #split(/PATTERN/, EXPR, LIMIT)
    #其中,/PATTERN/ 是要使用的正则表达式模式,EXPR 是要分割的字符串,LIMIT 是一个可选参数,指定返回的最大字段数。如果省略 LIMIT,则返回所有字段。
    # 定义字符串
    $var_test = "runoob";
    $var_string = "www-runoob-com";
    $var_names = "google,taobao,runoob,weibo";

    # 字符串转为数组
    @test = split('', $var_test);
    @string = split('-', $var_string);
    @names = split(',', $var_names);

    print "$test[3]\n"; # 输出 o
    print "$string[2]\n"; # 输出 com
    print "$names[3]\n"; # 输出 weibo

    print "===========将数组转换为字符串===========\n";
    #Perl 中将数组转换为字符串使用 join() 函数,join() 函数可以将一个数组的元素连接成一个字符串,并使用指定的分隔符分隔每个元素。其语法如下:
    #join(EXPR, LIST)
    #其中,EXPR 是要使用的分隔符,LIST 是要连接的数组或列表。
    # 定义字符串
    $var_string = "www-runoob-com";
    $var_names = "google,taobao,runoob,weibo";

    # 字符串转为数组
    @string = split('-', $var_string);
    @names = split(',', $var_names);

    # 数组转为字符串
    $string1 = join( '-', @string );
    $string2 = join( ',', @names );

    print "$string1\n";
    print "$string2\n";

    print "===========数组排序===========\n";
    #Perl 中数组排序使用 sort() 函数,sort() 函数可以对一个数组进行排序,并返回一个新的排序后的数组。其语法如下:
    #sort BLOCK LIST
    #其中,BLOCK 是一个可选的代码块,用于指定排序的比较方式,LIST 是要排序的数组或列表。如果省略 BLOCK,则默认使用字符串比较进行排序。
    # 定义数组
    @sites = qw/google taobao runoob facebook/; #数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。
    print "排序前: @sites\n";

    # 对数组进行排序
    @sites = sort(@sites);
    print "排序后: @sites\n";

    print "===========合并数组===========\n";
    @numbers = (1,3,(4,5,6));
    print "numbers = @numbers\n";

    @odd = (1,3,5);
    @even = (2, 4, 6);
    @numbers = (@odd, @even);
    print "numbers = @numbers\n";

    print "---------------------------------------\n\n";
    #哈希
    print "===========哈希相关===========\n";
    #创建哈希
    #方法一:为每个 key 设置 value
    $data{'google'} = 'google.com';
    $data{'runoob'} = 'runoob.com';
    $data{'taobao'} = 'taobao.com';

    #方法二:使用列表创建哈希
    #列表中第一个元素为 key,第二个为 value。
    %data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');

    #也可以使用 => 符号来设置 key/value:
    %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

    #以下实例是上面实例的变种,使用 - 来代替引号:
    %data = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com');
    #使用这种方式 key 不能出现空格,读取元素方式为:
    $val = $data{-google};
    $val = $data{-runoob};

    #访问哈希元素
    print "\$data{'google'} = $data{'google'}\n";
    print "\$data{'runoob'} = $data{'runoob'}\n";
    print "\$data{'taobao'} = $data{'taobao'}\n";

    print "===========读取哈希值==========\n";
    #你可以像数组一样从哈希中提取值。哈希值提取到数组语法格式:@{key1,key2}。
    %data = (-taobao => 45, -google => 30, -runoob => 40);
    @array = @data{-taobao, -runoob};
    print "Array : @array\n";

    print "===========读取哈希的 key 和 value==========\n";
    #我们可以使用 keys 函数读取哈希所有的键,语法格式:keys %hash。
    %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
    @names = keys %data;
    print "$names[0]\n";
    print "$names[1]\n";
    print "$names[2]\n";
    #类似的我们可以使用 values 函数来读取哈希所有的值,语法格式:values %hash。
    @urls = values %data;
    print "$urls[0]\n";
    print "$urls[1]\n";
    print "$urls[2]\n";

    print "===========检测元素是否存在==========\n";
    %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
    if( exists($data{'facebook'} ) ){
    print "facebook 的网址为 $data{'facebook'} \n";
    }
    else
    {
    print "facebook 键不存在\n";
    }

    print "===========获取哈希大小==========\n";
    %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

    @keys = keys %data;
    $size = @keys;
    print "1 - 哈希大小: $size\n";

    @values = values %data;
    $size = @values;
    print "2 - 哈希大小: $size\n";

    print "===========哈希中添加或删除元素==========\n";
    %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
    @keys = keys %data;
    $size = @keys;
    print "1 - 哈希大小: $size\n";

    # 添加元素
    $data{'facebook'} = 'facebook.com';
    @keys = keys %data;
    $size = @keys;
    print "2 - 哈希大小: $size\n";

    # 删除哈希中的元素
    delete $data{'taobao'};
    @keys = keys %data;
    $size = @keys;
    print "3 - 哈希大小: $size\n";

    print "===========遍历哈希==========\n";
    foreach $key (keys %data){
    print "$key: $data{$key}\n";
    }
    print "---------------------------------------\n";
    while(($key, $value) = each(%data)){
    print "$key: $value\n";
    }
  • 运行结果:

    image-20260423182448765 image-20260423182518583 image-20260423182541153

Perl条件与循环语句

欢迎来到ssy的世界