perl 取字符串不带换行符_IC入职新同学必备技能手册 Perl (1)

欢迎点击上方蓝字关注↑

写在前面

准备用3-5篇文章的篇幅,将一些必备的技能cover一遍,期望对于入职IC的新同学有一些帮助。这些东西,每一项其实在网络上的介绍资源都非常丰富,但是IC新同学常常面对的问题是,并不知道“原来这个事情是这么做的”。所以,长话短说。

预计的topic list:

  • Shell and Vim (完成)

  • 正则表达式 (完成)

  • Perforce (版本管理系统)

  • Shell脚本套路(正在写)

  • Tcl脚本套路

  • Perl脚本套路 (完成)

  • Makefile套路

马上开始

  • 推荐一个online Perl editor,随写随执行,我经常用来验证吃不准的写法(间接说明Perl的蛋疼),免费的。

  • 后面所有代码都可以直接copy+paste到online editor里面试运行,边试边写才好。

https://www.jdoodle.com/execute-perl-online/www.jdoodle.com

然后再推荐一个中文Perl使用速查工具网站(很基本,但高级用法不全面)

Perl 哈希 | 菜鸟教程www.runoob.com

Perl脚本的主要用途

  • 最重要的就是处理文本,和一些Hash类的config数据;

  • 因为Perl也支持类操作(简单的继承,貌似没有虚函数功能-就是类函数的重定义),因此,一些in-house的EDA flow会用Perl作为接口语言。比如nv的Clock design system.

  • 铺垫了很多Perl如何语法不严谨,但是,看完这篇文章,你会觉得Perl也就那么回事。注意,本文并没有提供特高级的Perl套路,仅仅用于普通IC工程师的普通操作。

套路1:变量

  • Perl语言其实没有数据类型的区别,任何数据(整数、浮点数、字符、字符串)都一视同仁,随便处理。

  • Perl根据数据的组织形式,分为标量($)、数组(@)、哈希量(%)

  • 变量有作用域的区别,一般my表示局部变量(怎么局部,以code block决定,或者不管它,无脑my->my过一次就不能再my了。。);our表示全局标量。

# 普通变量(标量)
my $var = 1;
$var = 'abc';
# 不能再my啦!双引号允许使用转义字符,单引号不行
# 比如'\n',就是认为是\n,而不是换行符

# 数组
my @arr = ('a', 1, 'string a b');

# 哈希
# 很少使用%my_hash这样的形式定义hash, 这个叫显性定义
# 更多的是使用所谓“隐性”定义,例如
$my_hash = {
'chip_name' => 'ga100',
'tree_path' => {
'current' => '/home/abc',
'old' => '/home/xyz',
},
}; # Perl语言对于白空格很随意,
# 用分号结尾即可

print $my_hash->{'chip_name'} , "\n";
(结果是) ga100
print $my_hash->{'tree_path'}->{'old'}, "\n";
(结果是) /home/xyz

套路1.1:特殊功能和变量

$_

$_  # 可以将它理解为,
#当前代码块的默认变量
# 尤其常用于foreach
# example
my @arr = (a, b, c);
# 定义数组,字符可以忽略引号
print $_, "\n" foreach @arr;
# 这里$_ foreach循环中的当前元素

# 输出
a
b
c

@_

@_  # 用于函数传参,
# 对!Perl的子函数,没有C那样的参数列表,
# 想传什么就传什么
# 具体例子在函数套路中讲解

die / unless

die # 其实就是强制异常退出
# 比如
die ("Error happened!");
# 这句话强制让脚本退出,
# 且在terminal输出这句话,作为error msg.
# ===========
# 配合unless. unless其实的作用类似if语句
# 比如
die ("File $file_path is not found.") unless (-e $file_path);
# -e 是代表检测文件是否存在
# 翻译过来就是,强制退出并提示信息,除非!$file_path文件存在.

next/last : 用于循环中,顾名思义,next强制跳过当前循环,进入下一个。last表示,强制结束本次循环,跳出循环block(不管循环还有多少次结束)

chomp : 非常常用!用于去掉字符串结尾的换行符,也就是\n。为啥?

my $path = `pwd`;  # ``表示执行shell命令
die ("The folder not exist.") unless (-d $path);
# die/unless出现啦, -d表示检测文件夹是否存在
# 但是!无论$path存在与否,这句话肯定会强制退出,
# 因为`pwd`的返回字符串结尾有换行符,经常在这里吃亏。
# ========================
# 换种方式
my $path = `pwd`;
chomp($path); # 去掉换行符
die ("The folder not exist.") unless (-d $path);
# 这样就不会因为换行符的缘故,误退出了。

套路2:逻辑分支(if..else.. foreach)

if..else.. 巨简单。

if ($var == 1) {
# 对于数值量比较, == , <= , >= , < , > 都可以
} elsif {$var eq 'abc'} {
# 这里注意!第一,Perl使用elsif, 而不是elseif !
# 注意这里用的是eq !
# 对于字符串的相等,只能用eq (equal) 和 ne (not equal)。
} else {
# 嗯,else还是和其他语言类似的
}

foreach循环

# foreach循环其实有两种套路
# 普通的
my @arr = (a , b , c);
foreach my $elem (@arr) {
# 注意:my的使用,因为$elem前面没定义,
# 所以这里必须定义用my。
# 其次, elem的作用域仅仅在这个foreach block
# 括号()是标准格式哦,常常忘记

print "Current elem is $elem \n"; # 常规用法
# 为啥不能用$_ ?因为你都指定每个元素放在$elem里啦!
}
# 想用$_ ?
foreach (@arr) {
print "Current elem is $_ \n" ;
# 可以的。没必要为了用$_而用,看个人习惯。
}

===

# foreach循环最常用的是搭配哈希,
# 为啥,因为IC环境里面,hash存储着大量的config数据,
# 需要拿出来各种操作
my $my_hash = {
'ga100' => 'go_fab',
'gv100' => 'shipped',
'gm100' => 'shipped'
};

foreach my $chip_name (keys %{$my_hash}) {
# 这里有点复杂:
# keys 是Perl內建命令,用于返回参数hash当前层次的所有key name
# %{} 表示将隐性定义的hash强制转换为显性,
# 为啥,因为keys只认显性hash
# $my_hash 你会迷糊,$不是表示标量么?
# 对,但这里的标量可以理解为hash数据结构的头指针

print "$chip_name status: $my_hash->{$chip_name} \n" ;

}

(结果是)
gm100 status: shipped
ga100 status: go_fab
gv100 status: shipped

鉴于篇幅太长,对于阅读来说,会很不友好。

后面会分两篇续集:

续集1:

  • 套路3:文本操作(需要会正则表达式)

续集2:

  • 一个实际脚本的全套注释

642a33f6e39233879d1682f9ac601a63.png

欢迎关注

了解更多IC行业知识

微信 : 牛排的IC技能树

知乎: 生的安格斯牛排

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值