• 【Linux/脚本/芯片学习】Perl学习


    Title:Perl学习

    • 个人学习策略

      主用python.

      看懂perl 和 tcl 即可。

    • 之前的存货
      开始搬砖后,整理 ”网络发布版笔记“ 的心思寡淡了好多,可能就是被工作榨干的原因8…
      但今天至少得赶个1024节日… ( ̄▽ ̄)"~

    1 介绍

    • 是什么

      Perl (Practical Extraction and Report Language),实用报表提取语言。

      偏向文本处理的脚本语言。

    • 脚本的作用

      实现一些自动化工作:如写个tcl,由当前系统时间自动生成唯一的版本号;设计一个脚本进行数据格式转换;用脚本实现个人HDL编码习惯的module模板;

      脚本语言是文本文件,解释执行

    • 安装

      perl的编译器有 ActiveStatePerl 和 Strawberry Perl,前者轻量级,后者包含些第三方库CPAN,自己定,以下以后者为例;

      1. 下载语言包位置:Perl Download

      2. 检查系统环境变量path是否更新:

        cmd中输入:perl -v

        有显示则成功,否则自己加环境变量到path中:

        把perl 安装地址 .\perl\bin 加到path环境变量里即可.

        (重新验证得重开cmd)

    • 各种脚本语言的对比:perl、tcl、python

      大部分Linux都自带了这三种脚本语言。

      • 正则表达式

        三个都支持正则:但perl支持最好最简洁、py兼容Perl的标准但要re库、tcl用的是另一套标准。

      • Python

        语言风格:类似matlab;

        优势:写一些开发用个人的小工具,有更丰富、成熟的库而更有优势

        缺陷:EDA工具支持性不好;分为 2.7 和 3.x 俩不兼容的版本,有点麻烦;

        后缀.py

      • Tcl

        语言风格:类似C库,被C调用很方便;

        优势:EDA支持性好;

        EDA工具内置的console都集成、支持 tcl,如:ModelSim、Vivado、Quartus;

        故tcl能更好地拓展EDA工具的功能和使用。

        缺陷:扩展库不够多而且老;

        后缀.tcl

      • Perl

        语言风格:类似shell的拓展;

        优势:深度集成正则,故很适合文本处理;优势之一是丰富的第三方库(CPAN)

        缺陷:库的质量难以保证;对文本外的开发没啥优势;且py也支持perl的正则标准,够用了。

        perl的缺陷是更偏向文本处理、库的稳定性也不够。

        后缀.pl.plx

    2 使用/运行

    • 关键文本头

      #!自己的perl目录/bin/perl -w -w表示开启warning.

      不知道目录,linux下可用 which perl查;

    • Linux下的系统指令和Windows下不同,Windows下是dos指令;

    • 运行

      执行文件

      perl 文件名.pl

      cmd中执行单行:

      perl -e 语句

    3 语法(看完后查阅用)

    3.1 叙述性语法

    碎片语言风格

    1. 行尾要有分号 ;

    2. 不关心空白;

    3. 弱语言类型,类似makefile.

    4. 语句块的{} 不能省略,不像C的单句可省。

    5. 运算符同C,

      多了个乘幂**逻辑非用的是not;逻辑或、逻辑且,支持and/or也支持&& / ||

      支持 +=++ 这类的使用;

    变量定义和使用

    • 定义

      标量$;后面正则元字符里还有符号$,勿混淆!

      • 未定义的变量,直接用$,那自然是空(不是空格哈).

      数组@

      哈希%

    • 使用

      使用都是用$!直接加符号即可,不用括号.

      e.g. 定义和使用都是 $var ;别和makefile弄混了—— makefile使用需要有 {},perl不用.

    • 数值的使用

      默认把整数按浮点数存;

      $a = 666;
      $a = 666.66 + 6.6e+6 -0.66;
      
      • 1
      • 2
    • 数组

      #定义
      @array = (1,2,3);
      @str = ( "1", "2", "3");
      #使用
      print $str[0];
      
      # 数组复制
      @copy = @array;		
      # 获得数组个数
      $len = @array;	#取决于等号左边的变量类型
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 哈希

      #定义
      %data = ('key1' => 1, 'key2' => 2);
      #使用
      print $data{'key1'};
      
      • 1
      • 2
      • 3
      • 4

    标识符

    大小写敏感,同C. —— 字母、数字(不可开头)、下划线.

    输出

    不会自动换行;用不用括号()都行

    print(1..5);		#输出 1 2 3 4 5
    
    print "xxx";						# 单输出
    
    $str="ABC";
    print $str, "\n";			#同下
    print "$str\n";		#同上,因为会自动转义
    
    $num = 6.66;
    print("牛哇牛蛙: "$num, "\n" );	# 多段输出,其实有没有括号无所谓
    print "牛哇牛蛙"$num, "\n";		# 也OK.
    
    # Error print ($num + "\n");		# + 只能用于数值计算
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注释

    • 单行

      #

    • 多行

      =pod
      ...
      =cut
      
      • 1
      • 2
      • 3

    转义

    \
    大体使用是和 C 一致,多了一些内容:

    \u	#下个字符,强制大写
    \l	#下个字符,强制小写
    
    \U	#后续字符,全部强制大写,用\E结束
    \L	#后续字符,全部强制大写,用\E结束
    \Q	#后续非单词字符,强制转义,用\E结束
    \E	#上述连续行为的结束标志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    字符串

    可以跨行写内容(输出包含换行符,同原格式);

    • 单引号

      强制视为文本,不解析转义

    • 双引号

      会对串内包裹内容 解析转义

    print "$name 666"			#转义
    print '$name 666'			#不转义,且可多行内容
    
    print "123
    456"				#包含换行符
    print '123
    456'				#同上
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    混合使用,同python:不用转义,自动夹杂。

    • 字符串的拼接

      $a = "abc";
      $b = "efg";
      # 正确的串拼接方式 1
      $c = "$a$b";	#别有空格
      # 正确的串拼接方式 2
      $c = $a.$b;
      
      # 错误的串拼接方式
      # $c = $a + $b;		# + 号只能进行数值计算
      # $c = ($a, $b);	# 没毛用
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 存储大段原格式字符串文本

      = << "标志" 来存文本,意思是:从下一行开始,俩 标志 之间夹杂的所有字符都按原格式存入变量中。

      $str = <<  "EOF";
      EOF
      正所谓天下大事,合久必分,分久必合...
      很久很久以前...
      ...
      EOF
      print $str;		# 就是上面这段文本
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • vstring

      用来表示IP这种用 . 隔开的数字;可用v开头即可:

      $ip = v192.168.0.1;$

      但我试了一下,乱码。( ̄▽ ̄)"

    • 字符串比较

      $a lt $b		# 串a < 串b?  成立则1.
      $a gt $b		# 串a > 串b?  成立则1.
      $a le $b		# 串a <= 串b?  成立则1.
      $a ge $b		# 串a >= 串b?  成立则1.
      $a eq $b		# 串a == 串b?  成立则1.
      $a ne $b		# 串a != 串b?  成立则1.
      $a cmp $b		# 串a < 串b,则1;串a == 串b,则0;串a > 串b,则-1;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    特殊符号

    __FILE__		#当前perl脚本的 文件名
    __PACKAGE__		#当前脚本的 包名
    __LINE__		#当前	行号
    
    • 1
    • 2
    • 3

    3.2 控制语句

    条件语句

    • 支持 a= b?c:d;

      同C.

    • if-elsif-else

      elsif 不是 else if !

      if()	{}
      elsif()	{}
      else	{}
      
      • 1
      • 2
      • 3
    • 反人类的 unless

      if是真,则执行;unless是假,则执行.

      unless(A){}		# A为false,才执行
      elseif(B){}		# 同if-else, B真,才执行
      else{}		#剩余的
      
      • 1
      • 2
      • 3
    • switch

      switch (){
         case 1            { print "数字 1" }
         case "a"          { print "字符串 a" }
         case [1..10,42]   { print "数字在列表中" }
         case (\@array)    { print "数字在数组中" }
         case /\w+/        { print "正则匹配模式" }
         case qr/\w+/      { print "正则匹配模式" }
         case (\%hash)     { print "哈希" }
         case (\&sub)      { print "子进程" }
         else              { print "不匹配之前的条件" }	#对标C的default
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    循环语句

    • while / do-while

      while() {
      
      }
      
      do{
      
      } while()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • until (和while反着来)

      until( A ){		# A 为真,则不执行
      
      }
      
      • 1
      • 2
      • 3
    • for

      for( ; ; ){
      
      }
      
      • 1
      • 2
      • 3
    • foreach

      用于数组内的元素迭代.

      foreach $a (@list) {	#若元素$a 在list中,则执行
      
      }
      
      • 1
      • 2
      • 3

    3.3 正则表达

    是常用语言中最强大的正则功能。

    • 三种基本形式

      • 匹配m/.../可简写为 //);
      • 替换s/...A.../...B.../; 把A换成B.
      • 转化tr/...A.../...B.../

      =~!~ 组合使用:

      • =~:匹配.
      • !~:不匹配.
      # 匹配 Example
      $str = "I love studying...";
      if( $str =~ /love/ ){			#单句也不能省略 {}
      	print "match";
      }
      elsif( $str !~ /love/ ){
      	print "not match";
      }
      
      # 替换 Example
      $str = "I love studying...";
      $str =~ s/love/hate/;
      print "$str\n";					#输出 I hate studying...
      
      # 转化 Example
      $str = "I love studying...";
      $str =~ tr/a-z/A-Z/;			#小写字符换成大写
      print "$str\n";					#输出 I HATE STUDYING...
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    • 分别可以后接不同的下操作符

      i 忽略大小写;

      m 多行模式;

      s 单行匹配;

      o 仅执行一次;

      g 全局匹配;

      s 产出重复字符;

      其他,略了。

    • 正则匹配后的内容提取

      $`		# 匹配部分的前一部分字符串
      $&		# 匹配成功的字符串
      $'		# 匹配剩余的字符串
      $n		# 表正则式中的 第n个小括号 匹配成功的串值,如$1, $2
      
      • 1
      • 2
      • 3
      • 4
    • 通用的正则元字符与转义字符

      类似vim,copy自vim章节:(maybe滞后)

      ^	#匹配字符串的“开头”;vim中则表行首;
      $	#匹配字符串的“末尾”,不是换行符哈,是串尾;vim中则表行尾;
      <	#匹配单词首。
      >	#匹配单词尾。
      
      \b	#匹配一个单词的边界。
      \d 	#匹配任意数字。
      \D	#匹配任意非数字字符。
      x?	#匹配一个可选的 x 字符 (i.e.匹配 1次或 0次)。
      x*	#匹配0次或者多次 x 字符。
      x+	#匹配1次或者多次 x 字符。
      x{n}	#匹配n个 x字符
      x{n,m}	#匹配 x 字符,至少 n 次,至多 m 次。
      (a|b|c)	#要么匹配 a,要么匹配 b,要么匹配 c。
      (x)	#一般情况下表示一个记忆组 (remembered group)。你可以利用 re.search 函数返回对象的 groups() 函数获取它的值。
      .	#匹配任意单个字符,换行符\n不算
      \s	#匹配所有空白符,包括换行
      \S	#匹配所有非空白符
      \w	#匹配 字母|数字|下划线
      \d\D 	#表示任意字符,包括换行符
      \s\S	#也表示任意字符,包括换行符
      
      # 以下是几个转义符
      \n	#1个换行符
      \r	#1个回车符
      \t	#1个制表符
      \f	#1个换页符s
      
      # 以下是判断逻辑,需要和 () 联用,
      # 来截取特定情境下的串,如(?!a|b),不要字符a或字符b.
      # e.g. 我需要截取 aaabbbccc 中的bbb,则正则表达式为:(?<=aaa).*(?=ccc)
      ?!pattern	#需要后面 不跟pattern的
      ?!<pattern	#需要前面 不跟pattern的
      ?=pattern	#需要后面  跟pattern的
      ?<=pattern	#需要前面  跟着pattern的
      ?i		#后面字符忽略大小写
      ?-i		#前面字符忽略大小写
      
      • 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

    3.4 自练题

    • 明辨 变量定义的$正则元字符$

      $tag = "stone";
      $str = "$tag \$tag stone\nLine 2: stone";
      $str =~ s/$str$/666/;
      print #str, "\n";		# 问原串str,以及后输出是什么?
      
      
      #str原串:
      #stone $tag stone
      #Line2: stone
      
      #输出内容:
      #stone $tag stone
      #Line2: 666
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
  • 相关阅读:
    C++初阶 | [四] 类和对象(下)
    鸿蒙系列-如何使用好 ArkUI 的 @Reusable?
    给nginx部署https及自签名ssl证书
    论文解读(SUBLIME)《Towards Unsupervised Deep Graph Structure Learning》
    【数据增强】
    精通 Verilog HDL 设计之编码风格(1)引言
    ThreadLocal
    原生JS实现移动端短信验证码功能
    CVE-2022-41082:Microsoft Exchange 反序列化类型混淆 RCE 漏洞简单分析
    (二)基于企业现金流预测的投资决策-算法实现
  • 原文地址:https://blog.csdn.net/Hide_in_Code/article/details/134019545