当前位置: 首页 > news >正文

【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;
    
  • 数组

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

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

标识符

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

输出

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

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

注释

  • 单行

    #

  • 多行

    =pod
    ...
    =cut
    

转义

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

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

字符串

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

  • 单引号

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

  • 双引号

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

print "$name 666"			#转义
print '$name 666'			#不转义,且可多行内容print "123
456"				#包含换行符
print '123
456'				#同上

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

  • 字符串的拼接

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

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

    $str = <<  "EOF";
    EOF
    正所谓天下大事,合久必分,分久必合...
    很久很久以前...
    ...
    EOF
    print $str;		# 就是上面这段文本
    
  • 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;
    

特殊符号

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

3.2 控制语句

条件语句

  • 支持 a= b?c:d;

    同C.

  • if-elsif-else

    elsif 不是 else if !

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

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

    unless(A){}		# A为false,才执行
    elseif(B){}		# 同if-else, B真,才执行
    else{}		#剩余的
    
  • 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
    }
    

循环语句

  • while / do-while

    while() {}do{} while()
    
  • until (和while反着来)

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

    for( ; ; ){}
    
  • foreach

    用于数组内的元素迭代.

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

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...
    
  • 分别可以后接不同的下操作符

    i 忽略大小写;

    m 多行模式;

    s 单行匹配;

    o 仅执行一次;

    g 全局匹配;

    s 产出重复字符;

    其他,略了。

  • 正则匹配后的内容提取

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

    类似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		#前面字符忽略大小写
    

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
    

相关文章:

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

Title&#xff1a;Perl学习 个人学习策略 主用python. 看懂perl 和 tcl 即可。 之前的存货 开始搬砖后&#xff0c;整理 ”网络发布版笔记“ 的心思寡淡了好多&#xff0c;可能就是被工作榨干的原因8… 但今天至少得赶个1024节日… (&#xffe3;▽&#xffe3;)"~ 1 介…...

嵌入式实时操作系统的设计与开发(信号量学习)

信号量 除了临界点机制、互斥量机制可实现临界资源的互斥访问外&#xff0c;信号量&#xff08;Semaphore&#xff09;是另一选择。 信号量与互斥量的区别 对于互斥量来说&#xff0c;主要应用于临界资源的互斥访问&#xff0c;并且能够有效地避免优先级反转问题。对于信号量…...

python环境安装教程

Python是一种流行的高级编程语言&#xff0c;它简单易学、功能强大&#xff0c;适用于各种应用领域&#xff0c;从Web开发到数据科学和人工智能。在本教程中&#xff0c;我将向您介绍如何安装Python并设置您的开发环境。请注意&#xff0c;以下步骤适用于Windows操作系统。 步…...

【学习笔记】CF1784F Minimums or Medians

首先让 n n n乘上 2 2 2。 考虑枚举最终被删除的位置有哪些。 a i 0 a_i0 ai​0表示这个位置被删除&#xff0c; a i 1 a_i1 ai​1表示这个位置被保留&#xff0c;设满足 a i 0 a_i0 ai​0的前缀长度为 l l l&#xff08; l l l是偶数&#xff09;&#xff0c; p r e i pre…...

如何系列 如何玩转远程调用之OpenFegin+SpringBoot(非Cloud)

文章目录 简介原生Fegin示例基础契约日志重试编码器/解码器自定义解码器 请求拦截器响应拦截器表单文件上传支持错误解码器断路器指标metrics客户端 配合SpringBoot&#xff08;阶段一&#xff09;配合SpringBoot&#xff08;阶段二&#xff09;1.EnableLakerFeignClients2.Lak…...

Python学习第2天-安装pycharm

文章目录 前言一、下载二、安装1.选择安装目录2.安装配置 总结 前言 好用的工具可以极大地提高生产力&#xff0c;开发Python推荐使用jetbrains全家桶的pycharm。 一、下载 通过官网下载安装包。 二、安装 1.选择安装目录 2.安装配置 一路Next&#xff0c;安装完成 总结 …...

等电位连接器行业应用综合方案

等电位连接器的原理 等电位连接器的原理是利用气体放电管或压敏电阻等非线性元件&#xff0c;当连接器两端的电位差大于所限峰值电压时&#xff0c;连接器导通&#xff0c;迫使连接器两端不同接地体电位基本相等&#xff0c;消除接地体间放电现象&#xff0c;从而避免了由于地…...

内裤洗衣机有用吗?最好用的四款内衣洗衣机测评

相信很多小伙伴往往会因为懒而不想洗内衣&#xff0c;又或者洗内衣时经常会洗不干净&#xff01;这时就很有必要入手一台内衣洗衣机了&#xff0c;当我们洗完澡时&#xff0c;顺手把内衣放入洗衣机内&#xff0c;一键启动即可把我们的内衣洗得干干净净&#xff01;同时还可以为…...

足底筋膜炎能自愈吗

什么是足底筋膜炎 足底筋膜炎是足底的肌腱或者筋膜发生无菌性炎症所致。最常见症状是脚跟的疼痛与不适&#xff0c;压痛点常在足底近足跟处&#xff0c;有时压痛较剧烈&#xff0c;且持续存在。晨起时疼痛感觉明显&#xff0c;行走过度时疼痛感加剧&#xff0c;严重患者甚至站…...

牛客网刷题-(3)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

Centos7 安装 Etcd

Github上下载并解压安装包 wget https://github.com/coreos/etcd/releases/download/v3.4.10/etcd-v3.4.10-linux-amd64.tar.gz tar xzvf etcd-v3.4.10-linux-amd64.tar.gz mv etcd-v3.4.10-linux-amd64 /opt/etcd解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是serve…...

powerjob基于springboot2.1.6.RELEASE版本的问题研究

项目背景&#xff1a;基于第三代框架的集成问题&#xff0c;如果对于powerjob不熟悉的朋友&#xff0c;可以参考官方文档PowerJob 简介 语雀 关于语雀 23 日故障的公告 (qq.com) 简单插一句&#xff0c;针对语雀文档故障的心得&#xff0c;数据恢复&#xff0c;完整性&#…...

【AI视野·今日CV 计算机视觉论文速览 第270期】Wed, 18 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Wed, 18 Oct 2023 Totally 60 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers 4K4D: Real-Time 4D View Synthesis at 4K Resolution Authors Zhen Xu, Sida Peng, Haotong Lin, Guangzhao He, Jiaming …...

uni-app小程序,uview-ui组件样式无法穿透修改的解决办法

1.首先设置以下选项.该选项的作用是让微信小程序允许样式穿透. 在需要改动的文件内加上 options: { styleIsolation: shared } 2.然后再使用vue的样式穿透写法. ::v-deep .类样式{} 或者 /deep/ .类样式{}...

Codeforces Round 515

Portal. C. Books Queries Portal. sol. D. Boxes Packing Portal. 把从左至右删物品转化为从右至左加物品。模拟即可。 #include <bits/stdc.h> using namespace std;const int maxn2e55; int a[maxn];int main() {int n,m,k;cin>>n>>m>>k;for(…...

Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

一、 Linux shell 脚本编程中的数组概述 数组是一种常见的数据结构。跟大多数编程语言一样&#xff0c;大多数Linux shell脚本支持数组&#xff0c;但对数组的支持程度各不相同&#xff0c;比如数组的维度&#xff0c;是支持一维数组还是多维数组&#xff1f;再如&#xff0c;…...

k8s部署kafka,并使用zookeeper做注册中心

kafka在3.x版本后增加KRaft作为自己的注册中心&#xff0c;可以不依赖外部的zk&#xff1b;这里上一篇已经部署好了zk&#xff0c;kafka依然使用zk作为注册中心。 这里使用kafka是为集成zipkin收发微服务接口链路日志数据&#xff0c;只需要部署1个实列即可够用。 编写脚本yam…...

关于Nginx缓存

Nginx缓存 一般情况下系统用到的缓存有三种 服务端缓存&#xff1a; 缓存存在后端服务器&#xff0c;如redis代理缓存&#xff1a; 缓存存储在代理服务器或中间件&#xff0c;内容从后端服务器获取&#xff0c;保存在本地客户端缓存&#xff1a; 缓存在浏览器什么时候会出现3…...

为什么Open3D可视化TensorFlow张量速度超慢

问题描述 在使用Open3D可视化TensorFlow张量表示的点云时速度超慢 原因分析 可能是因为Open3D没有针对tf.Tensor做优化&#xff0c;也可能是tf.Tensor本身没有对张量的操作做优化&#xff0c;所以可能如果要在CPU中计算&#xff0c;numpy可能性能更好。 解决方案 open3d.u…...

使用element-UI Cascader组件,实现第一级单选选,第二级,第三级,子级可以多选

最近开发过程中&#xff0c;遇到需求测一个需求&#xff0c;就是级联选择器&#xff0c;需要多选&#xff1b;但是第一级是单选&#xff1b; 既要单选又要复选。参照网上内容&#xff0c;自己整理了一下功能实现&#xff1b; 如下图&#xff1a; 思路&#xff1a;1.把第一层的…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...