• 【perl】基本语法 /备忘录/






    分享 perl 语言学习资源

    Perl 教程|极客教程 (geek-docs.com)

    Perl [zh] (runebook.dev)

    Perl 运算符 | 菜鸟教程 (runoob.com)

    Perl Documentation - Perldoc Browser

    Search the CPAN - metacpan.org

    当然还有一些经典书籍,不再列举。 


    1、数字

    1.1、数字表示

    perl内部会把所有的数字当做浮点数进行处理。如果一个数字太长,可以使用下划线将数据分开,便于阅读。

    与其他语言类似,支持整数的其他进制表示,十六进制0x,八进制0,二进制0b。

    同样支持幂指数表示。

    example:

    1. $a = 1.23_456;#十进制
    2. print "$a\n";
    3. $b = 0xFF_FF;#十六进制
    4. print "$b\n";
    5. $c = 0377;#八进制
    6. print "$c\n";
    7. $d = 0b1101;#二进制
    8. print "$d\n";
    9. $e = 1.3e-3;#指数表示
    10. print "$e\n";

    result:

    1. 1.23456
    2. 65535
    3. 255
    4. 13
    5. 0.0013

    1.2、数字操作符

    基本的加减乘除运算,+ - * /

    取模(求余)运算 % ,对于小数的求余 ,会将操作数的小数部分直接去掉(即,向下取整)然后再做求余运算,如 10.99 % 3 = 1。可以将操作数变为负数,如 -10.01 % -7 = -3;-10.01 % 7 = 4

    指数运算符  ** ,如2**3 = 8。负数的非整数次方运算会产生复数,复数的运算需要Math::Complex 模块。

    1. use Math::Complex;
    2. # $cc = cplx(3,4);
    3. $cc = 3+4*i;
    4. print $cc**2 . "\n";

     Perl - Math::Complex [zh] (runebook.dev)

    这个网址有很多中文的perl语法手册。 

    2、字符串

    2.1、单引号字符串

    单引号里面的转义字符,只支持单引号和反斜线。其他字符均表示自身。

    示例:

    1. $s1 = 'asdf\'\\\n qwe
    2. \twefff';
    3. print $s1 ;

    result:

    1. asdf'\\n qwe
    2. \twefff

    2.2、双引号字符串

    双引号字符串支持所有的转义字符。

    example:

    1. $s2 = "asdf\'\\\nashs\thjlidce12#\"";
    2. print $s2;

    result:

    1. asdf'\
    2. ashs hjlidce12#"

    perl中文教程:Perl 教程|极客教程 (geek-docs.com)

    2.3、字符串操作符

    . 可以将字符串前后连接。

    x 可以将字符串复制粘贴,x后面的次数如果是小数,将小数向下取整后复制粘贴。

    字符串和数字之间,perl 解释器会根据语境自动转换。

    example:

    1. print "HELLO WORLD " . "HELLO PERL" . "\n";# 字符串连接
    2. print "hello perl \n" x 3;
    3. print 3 x 10 . "\n";
    4. print 1 x 3.99 . "\n";
    5. print "A" . 3*8 . "\n";

    result:

    1. HELLO WORLD HELLO PERL
    2. hello perl
    3. hello perl
    4. hello perl
    5. 3333333333
    6. 111
    7. A24

    3、perl 内置警告

    有几种使能警告的方式:

    1、在终端运行时: perl -w perl_program.pl

    2、 perl代码的第一行:#! /usr/bin/perl/ -w

    3、perl代码的前面打开使能:use warnings;

    如果不理解警告信息,可以使用诊断:use diagnostics;

    4、标量变量

    标量变量只能存放一个标量值。命名方式和其他语言不一样的是,变量名称由$符号后接标识符组成。标识符由数字、字母、下滑线组成,不可以由数字开头。

    变量赋值几种方式:

    1、单纯使用 = 赋值。

    2、使用 += 、*=、 /=、 .=、 等。

    字符串标量变量的内插(仅双引号有效):

    $str1 = "12345678980";

    $str2 = "You input $str1";#将str1插入str2

    print $str2;

    $str3 = "You input \$str1";#转义字符使得str2不会插入str3

    4、if

    基本与C语言一致,example:

    需要注意的是 perl 的 elseif 写作 elsif

    1. $str22 = "vhwroivqpo";
    2. if($str22 eq "abc")
    3. {
    4. print "OK" . "\n";
    5. }
    6. else
    7. {
    8. print "NOT OK" ."\n";
    9. }

    5、用户输入

    输入操作符 示例:

    1. print "input something you want please." . "\n";
    2. $line = ;
    3. chomp $line;
    4. print "your input is $line" . "\n";

    chomp 操作用于去掉行尾的换行符。

    6、while 

    perl 程序出现死循环,使用Ctrl + C强制结束。

    while的句法和C语言中差不多。

    Perl 循环 | 菜鸟教程 (runoob.com)

    1. $count = 0;
    2. while ($count < 10) {
    3. $count += 2;
    4. print "count is now $count\n"; #打印出2 4 6 8 10
    5. }

    7、undef

    变量在定义后,如果没有被赋值,其默认值为 undef 。

    对于数字变量,undef 等价于 0。如果是字符串变量,undef则表现为空字符串。

    8、defined

    由于undef 有默认行为,在程序执行过程中不报错,但是容易产生不易于理解的方面,可以使用defined函数分辨变量是否为undef,若是 未定义 则返回false,否则返回 true 。

    example:

    1. $ee ;
    2. if(not defined($ee))
    3. {
    4. print "it is a empty string" . "\n";
    5. }
    6. $ee = "123";
    7. if(defined($ee))
    8. {
    9. print "it is a non-empty string :" .$ee . "\n";
    10. }

    result:

    1. it is a empty string
    2. it is a non-empty string :123

    9、数组/列表

    Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。

    数组变量以 @ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下。

    索引序号由0开始,-1表示列表的最后一个元素,$#列表变量名 同样表示最后一个列表元素的索引值。数组内元素的修改则可以通过索引直接赋值的形式进行。

    1. @list1 = (1,2,3,4,5,6,7,8);
    2. print $list1[1] . "\n";
    3. print $list1[$#list1] . "\n";# 索引最后一个
    4. print $list1[-1] . "\n";# 索引最后一个
    5. $list1[0] = "1";
    6. $list1[1] = "2";
    7. $list1[2] = "1";
    8. $list1[3] = "2";
    9. $list1[4] = "1";
    10. $list1[5] = "2";
    11. $list1[6] = "1";
    12. $list1[7] = "2";
    13. print $list1[1] . "\n";
    14. print $list1[$#list1] . "\n";# 索引最后一个
    15. print $list1[-1] . "\n";# 索引最后一个

    9.1 数组创建

    数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组。Perl 允许使用任何标点符号作为分界符,最好不要用 #

    Perl 提供了可以按序列输出的数组形式,格式为 起始值 + .. + 结束值。

    1. @p1 = qw !12 13 45 56 123 11 2223 2345!;
    2. @p2 = qw <12 13 45 56 123 11 2223 2345>;
    3. @p3 = qw *12 13 45 56 123 11 2223 2345*;
    4. @p4 = qw ?12 13 45 56 123 11 2223 2345?;
    5. @n1 = 0..10;
    6. @a1 = a..d;
    7. @p5 = @p2; #将p2列表拷贝到p5。
    8. ($p2[0],$p2[1]) = ($p2[1],$p2[0]);#变量交换
    9. $size1 = @p1; #数组长度
    10. $max_index = $#p1; #数组的最大索引号
    11. @p6 = (@p1,@n1,@a1);#列表的元素也可以为列表
    12. print $size1 . "\t" . $max_index . "\n";
    13. print @p2;print "\n";
    14. print @p6;print "\n";
    15. print @n1;print "\n";
    16. print @a1;print "\n";

     result:

    1. 8 7
    2. 131245561231122232345
    3. 121345561231122232345012345678910abcd
    4. 012345678910
    5. abcd

    9.2 pop 、push

    pop 操作将数组的最后一个元素取出并返回。

    push,它可以将一个元素(或者一列元素)加在数组的末尾。

    push 的第一个参数或者pop 的唯一参数必须是数组变量。

    1. @t1 = 'a'..'z';print @t1;print "\n";
    2. $a1 = pop @t1;print $a1;print "\n";
    3. push @t1,'k';print @t1;print "\n";
    4. push @t1,@t1;print @t1;print "\n";

    result:

    1. abcdefghijklmnopqrstuvwxyz
    2. z
    3. abcdefghijklmnopqrstuvwxyk
    4. abcdefghijklmnopqrstuvwxykabcdefghijklmnopqrstuvwxyk

    9.3 shift 、unshift

    unshift  和 shift  对一个数组的开头进行操作(数组的左端有最小下标的元素)。

    unshift类似于push;shift类似于pop。

    1. @t1 = 'a'..'z';print @t1;print "\n";
    2. $a1 = shift @t1;print $a1;print "\n";
    3. unshift @t1,'kkkk';print @t1;print "\n";
    4. unshift @t1,@t1;print @t1;print "\n";

    result:

    1. abcdefghijklmnopqrstuvwxyz
    2. a
    3. kkkkbcdefghijklmnopqrstuvwxyz
    4. kkkkbcdefghijklmnopqrstuvwxyzkkkkbcdefghijklmnopqrstuvwxyz

    9.4 取数组子集

    1. @t1 = ('a'..'z')[10..15];print @t1;print "\n";
    2. @t2 = @t1[1..3];print @t2;print "\n";

    result:

    1. klmnop
    2. lmn

    9.5 splice

    splice函数用于实现数据元素替换。

    示例:

    1. @t1 = ('a'..'z')[10..20];print @t1;print "\n";
    2. splice @t1, 2, 2, qw/& &/; print @t1;print "\n";
    3. splice @t1, 4, 2, qw/* */; print @t1;print "\n";

     result:

    klmnopqrstu

    kl&&opqrstu

    kl&&**qrstu

    9.6 split

    示例:

    1. # 定义字符串
    2. $var_test = "runoob";
    3. $var_string = "www-runoob-com";
    4. $var_names = "google,taobao,runoob,weibo";
    5. # 字符串转为数组
    6. @test = split('', $var_test);
    7. @string = split('-', $var_string);
    8. @names = split(',', $var_names);
    9. print "$test[3]\n"; # 输出 o
    10. print "$string[2]\n"; # 输出 com
    11. print "$names[3]\n"; # 输出 weibo

     result:

    o

    com

    weibo

    9.7 join

    example:

    1. # 定义字符串
    2. $var_string = "www-runoob-com";
    3. $var_names = "google,taobao,runoob,weibo";
    4. # 字符串转为数组
    5. @string = split('-', $var_string);
    6. @names = split(',', $var_names);
    7. # 数组转为字符串
    8. $string1 = join( '%', @string );
    9. $string2 = join( '*', @names );
    10. print "$string1\n";
    11. print "$string2\n";

     result:

    www%runoob%com

    google*taobao*runoob*weibo

    9.8 sort

    sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。如对于ASCII 字符串,将根据ASCII 序进行排序。和reverse 一样,其参数是不会受到影响的。如果想将某个数组排序,那必须将排序之后的结果存回数组中。

    1. # 定义数组
    2. @sites = qw(google taobao runoob facebook apple blue break cup);
    3. print "排序前: @sites\n";
    4. # 对数组进行排序
    5. @sites = sort(@sites);
    6. print "排序后: @sites\n";

     result:

    排序前: google taobao runoob facebook apple blue break cup

    排序后: apple blue break cup facebook google runoob taobao

    9.9 reverse

    reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。注意reverse 返回逆转的列表,它不会改变其参数的值。如果返回值没有赋值给某个变量,那这个操作是没有什么意义的。

    1. @t1 = ('a'..'z')[10..20];print "@t1\n";
    2. @t2 = reverse @t1;print "@t2\n";

    result:

    k l m n o p q r s t u

    u t s r q p o n m l k

    10、foreach

    主要用于遍历列表,语法格式:

    foreach var (list) {
    ...
    }
    

    示例:

    1. @t1 = ('a'..'z')[10..20];print "@t1\n";
    2. foreach $k (@t1){
    3. print "$k \n";
    4. }

    result:

    k l m n o p q r s t u

    k

    l

    m

    n

    o

    p

    q

    r

    s

    t

    u

    11、scalar

    scalar只是用来告诉perl 解释器这是一个标量。

    1. @rocks = qw(talc quartz jade obsidian);
    2. print "How many rocks do you have?\n";
    3. print "I have ", @rocks, "rocks!\n"; #错误,输出rocks 的名字
    4. print "I have ". @rocks. "rocks!\n"; #正确,输出其数字
    5. print "I have ", scalar @rocks, "rocks!\n"; #正确,输出其数字

    result:

    How many rocks do you have?

    I have talcquartzjadeobsidianrocks!

    I have 4rocks!

    I have 4rocks!

    12、多行输入 @lines = ;

    @lines = ; #读入所有的行
    chomp = (@lines); #去掉所有的换行符

    或者:

    chomp (@lines = ); #读入所有的行,不包括换行符

    Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z。

    13、子程序(函数)

    语法格式:

    13.1、向子程序传递参数

    Perl 子程序可以和其他编程一样接受多个参数,子程序参数使用特殊数组 @_ 标明。

    因此子程序第一个参数为 $_[0], 第二个参数为 $_[1], 以此类推。

    不论参数是标量型还是数组型的,用户把参数传给子程序时,perl默认按引用的方式调用它们。

    1. # 定义求平均值函数
    2. sub Average{
    3. # 获取所有传入的参数
    4. $n = scalar(@_);
    5. $sum = 0;
    6. foreach $item (@_){
    7. $sum += $item;
    8. }
    9. $average = $sum / $n;
    10. print '传入的参数为 : ',"@_\n"; # 打印整个数组
    11. print "第一个参数值为 : $_[0]\n"; # 打印第一个参数
    12. print "传入参数的平均值为 : $average\n"; # 打印平均值
    13. }
    14. # 调用函数
    15. Average(10, 20, 30);

    13.2、子程序返回值

    子程序可以向其他编程语言一样使用 return 语句来返回函数值。

    如果没有使用 return 语句,则子程序的最后一行语句将作为返回值

    13.3、子程序的私有变量

    默认情况下,Perl 中所有的变量都是全局变量,这就是说变量在程序的任何地方都可以调用。

    如果我们需要设置私有变量,可以使用 my 操作符来设置。

    my 操作符用于创建词法作用域变量,通过 my 创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。

    闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个 if, while, for, foreach, eval字符串。

    13.4、变量临时赋值

    我们可以使用 local 为全局变量提供临时的值,在退出作用域后将原来的值还回去。

    local 定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中。

    example:

    1. # 全局变量
    2. $string = "Hello, World!";
    3. sub PrintRunoob{
    4. # PrintHello 函数私有变量
    5. local $string;
    6. $string = "Hello, Runoob!";
    7. # 子程序调用的子程序
    8. PrintMe();
    9. print "PrintRunoob 函数内字符串值:$string\n";
    10. }
    11. sub PrintMe{
    12. print "PrintMe 函数内字符串值:$string\n";
    13. }
    14. sub PrintHello{
    15. print "PrintHello 函数内字符串值:$string\n";
    16. }
    17. # 函数调用
    18. PrintRunoob();
    19. PrintHello();
    20. print "函数外部字符串值:$string\n";

    result:

    PrintMe 函数内字符串值:Hello, Runoob!
    PrintRunoob 函数内字符串值:Hello, Runoob!
    PrintHello 函数内字符串值:Hello, World!
    函数外部字符串值:Hello, World! 

    13.5、静态变量

    state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久。

    state也是词法变量,所以只在定义该变量的词法作用域中有效。

    注1:state仅能创建闭合作用域为子程序内部的变量。

    注2:state是从Perl 5.9.4开始引入的,所以使用前必须加上 use。

    注3:state可以声明标量、数组、哈希。但在声明数组和哈希时,不能对其初始化(至少Perl 5.14不支持)。

    1. use feature 'state';
    2. sub PrintCount{
    3. state $count = 0; # 初始化变量
    4. print "counter 值为:$count\n";
    5. $count++;
    6. }
    7. for (1..5){
    8. PrintCount();
    9. }

    result:

    counter 值为:0

    counter 值为:1

    counter 值为:2

    counter 值为:3

    counter 值为:4

    子程序调用过程中,会根据上下文来返回不同类型的值,比如以下 localtime() 子程序,在标量上下文返回字符串,在列表上下文返回列表。

    1. # 标量上下文
    2. my $datestring = localtime( time );
    3. print $datestring;
    4. print "\n";
    5. # 列表上下文
    6. # $year 的值是从 1900 年作为起始年开始的计数
    7. ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
    8. printf("%d-%d-%d %d:%d:%d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
    9. print "\n";

    result:

    Wed Jun 12 15:17:32 2024

    2024-6-12 15:17:32

    14、运算符合集

    14.1、算术运算符

    14.2、比较运算符

    14.3、逻辑运算符

    14.4、赋值运算符

    14.5、位运算符

    14.6、引号运算符

    14.7、其他运算符

    14.8、运算符优先级

    15、三目运算符 ? : 

    16、时间日期

    Perl中处理时间的函数有如下几种:

    • 1、time() 函数:返回从1970年1月1日起累计的秒数
    • 2、localtime() 函数:获取本地时区时间
    • 3、gmtime() 函数: 获取格林威治时间

    Perl 时间日期 | 菜鸟教程 (runoob.com)

    17、正则表达式

    Perl的正则表达式的三种形式,分别是匹配,替换和转化:

    • 匹配:m//(还可以简写为//,略去m)

    • 替换:s///

    • 转化:tr///

    这三种形式一般都和 =~ 或 !~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。

    Perl 正则表达式 | 菜鸟教程 (runoob.com)

    18、POD

    pod本身的功能很强大,但是对于我而言,我喜欢在perl脚本中用=pod、=cut实现多行注释。

    1. =pod
    2. ========================================
    3. Author:
    4. Abstract:
    5. Date:
    6. Note:
    7. ========================================
    8. =cut

    19、__DATA__、__END__

    可以将其后的代码注释掉。

    example:

    1. print "vcqhewviu" . "\n";
    2. # __END__
    3. __DATA__
    4. print "vcqhewviu" . "\n";
    5. print "vcqhewviu" . "\n";
    6. print "vcqhewviu" . "\n";

    result:

    vcqhewviu

    20、哈希

    简单来说,哈希是 key/value 对的集合。

    Perl中哈希变量以百分号 (%) 标记开始。

    访问哈希元素格式:${key}

    以下是一个简单的哈希实例:

    1. %data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');
    2. print "\$data{'google'} = $data{'google'}\n";
    3. print "\$data{'runoob'} = $data{'runoob'}\n";
    4. print "\$data{'taobao'} = $data{'taobao'}\n";

    $data{'google'} = google.com

    $data{'runoob'} = runoob.com

    $data{'taobao'} = taobao.com

    Perl 哈希 | 菜鸟教程 (runoob.com)

  • 相关阅读:
    小心golang中的无类型常量
    领导的潜台词,你读懂了吗?
    微服务项目:尚融宝(50)(核心业务流程:标的管理(2))
    打造未来:AI产品经理的魔法之旅
    目标检测(Object Detection)概念速通
    【JavaEE初阶】线程的概念与创建
    简约的博客网页制作 大学生个人博客网页设计模板 学生个人网页成品 DIV简单个人网站作品下载 静态HTML CSS个人网页作业源代码
    深入理解java泛型
    『亚马逊云科技产品测评』活动征文|Amazon EC2 的讲解及相关服务
    【调度算法】关于轮盘赌和锦标赛两种选择算子的选用思考
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/139590278