Perl 语言入门6-9
---- 第6章 哈希-----------
简介
键值对。键和值都是任意标量,但键总是会被转换成字符串。
键唯一,值可重复。
应用场景:一组数据对应到另一组数据时。 如找出重复/唯一/交叉引用/查表等
访问哈希元素
$name{'fred'} = 'peng';
$name{'barney'} = 'guo';
foreach my $person (qw(barney fred)){print "you are $person $name{$person}.\n";
}#胖箭头
my %hash = ('red' => 'peng', #键的引号一般可省去'blue' => 'guo','green' => 'bai',
);
访问整个哈希
%hash = (12,"you",4,"are");
@array = %hash;
print "@array\n" #元素顺序会变
哈希赋值
my %new_hash = %old _hash; #两个hash顺序不一定完全相同
my %hash = reverse %oldhash; #反转键值对,适用于键值都唯一的哈希,如主机名和IP
哈希函数
- keys函数返回键列表
- values函数返回值列表
my @k = keys %hash;
my @v = values %hash;
#返回键和值列表顺序是一一对应的。
my $count = keys %hash; #3
- each函数迭代哈希,返回键值对
while( ($key, $value) = each %hash ){print "$key => $value\n";
}
#若要依次处理hash,需要对键进行排序
foreach $key (sort keys %hash){$value = $hash{$key};print "$key => $value\n";#或print "$key => $hash{$key}\n";
}
- exists函数:检查哈希中是否存在某个键
if($book{$someone}){ #判断hash元素真假print "$someone has at least one book checked out\n";
}
#这种情况下如果元素中本身含有0/undef等值,会错误判断。所以用exists函数。
if(exists $book{'peng'}){print "peng has a library card\n";
}
- delete函数:从哈希中删除指定键及其对应的值
my $person = "pjx";
delete $books{$person}
哈希元素内插
foreach my $person (sort keys %books){if(exists $book{$person}){print "$person has $book{$person}\n";}
}
- %ENV哈希: 即PATH(环境变量)对应的值(路径)
print "PATH is $ENV{PATH}\n";
--------- 第七章 正则表达式----------
简介
- 正则表达式是Perl内嵌的,自成一体的微型编程语言,如awk,sed,grep等语言以及vi,emacs等编辑器都带有正则表达,只是语法规则略有不同。
- 又称模式,查看一个字符串匹配或不匹配。
- 注意不要与shell中文件名通配(又称glob)混为一谈。
简单模式
默认匹配对象$_,则只要/chracter/即可
$_ = "abdgewgaegggea";
if(/dge/) {print "It matched\n";}
模式匹配通常用来返回真假,所以常用于while/if等条件中。
转义符/制表符等同样可以用于模式串中。
元字符
点号(.):匹配任意一个除换行符外的字符 (没有或超过一个都不行)。
在任何元字符前加上反斜线即失去元字符的作用。如/3\.14/
简单量词
* 星号:匹配前面的0个或多个
.* :匹配0到多个字符
+ 加号: 匹配一个或多个
? 问号:匹配0个或1个
模式分组
用小括号对字符串分组,如/(fred)+/
反向引用捕获组:引用小括号中所匹配的字符,\1,\2
$_= "abba";
if(/(.)\1/) #匹配bb$_ = "yabba dabba doo";
if(/y(....) d\1/) #匹配abba
if(/y(.)(.)\2\1/) #回文模式 匹配abba
if(/y((.)(.)\3\2) d\1/) #匹配模式顺序,从左到右半边括号依次对应123#反向引用的模式后接数字的情况:
$_ = "aa11bb";
if(/(.)\111/) #不知引用的是\1,\11,\111?
#消除以上二义性: \g{N}
if(/(.)g{1}11/)
if(/(.)(.)\g{-1}11/) #负号$_ = "xaa11bb";
if(/(.)(.)\g{-1}11/)
择一匹配
/fred(|\t)+barney/
/fred(or|and)barney/
字符集
一个好的正则模式应只匹配到需要的那些字符,不留一点多余。
[a-zA-Z] #[]匹配其中任何**一个**字符。 $_ = " The HAL-9298 requres";
if (/HAL-[0-9]+/)#脱字符^,表不匹配
[^def]
[^n\-z] #\转义#字符集的简写\d 数字: 近似于[0-9]
\s 空白符:包括换页符/制表符/换行符/回车符/空格,即等于[\f\t\n\r]
\w 单词字符(字母数字下划线):相当于[a-zA-Z0-9_]# 反义的简写
\D:即[^\d]
\W:即[^\w]
\S:即[^\s][\d\D] 匹配任何字符(包括换行符),比点号还广(不包括换行符)
----------- 第八章 正则匹配-----
匹配
m//
或m##
等,省略为//
或##
等
模式匹配修饰符
/i 忽略大小写 if(/yes/i)
/s 匹配任意字符
#(一般用于含换行符的字符串)if(/barney.*fred/s)/x 加入空白符
#(使之更加易读)if(/ -? [0-9]+ \.? [0-9]* /x)
#还能添加注释:当然注释中不能含有/等定界符,否则视为模式终点/-? #0或1个-[0-9]+ #至少1个数字\.? #0或1个.[0-9]* #至少0个数字/x #字符串末尾if(/barney.*fred/is) 组合修饰符,与顺序无关
字符串锚位(右斜线)
\A 锚位字符串开头 m{\Ahttps?://}i
\z 锚位字符串末尾 m{\.png\z}i
\Z 行末锚位,即在锚位字符串末尾但允许后面出现换行符 /\.png\Z/
/\A\s*\Z/ 组合匹配一个空行但最习惯的还是用脱字符^ $来锚位行的首尾。
行的首尾和字符串的首尾有一点区别:字符串有可能是多行。
但即使这样,我们仍倾向于用^$,只需后面加个修饰符/m即可。/^barney/m #等于/\Abarney\Z/
单词锚位
\b 匹配单词的首尾,整词匹配. /\bfred\b/
\B 非单词边界锚位。/\bsearch\B/ 匹配searching等
绑定操作符
模式匹配默认对象是$_
,用 =~ 拿右边的模式来匹配左边的字符串。
my $some = "this is a string";
if($some =~ /\bstr/){print "yes\n";}
捕获变量
$1,$2,$3...
类似反向引用的\1,\2,\3...
,但反向引用是模式匹配期间的结果,而捕获变量是匹配结束后捕获内容的索引。
$_ = "hello there, neighbor";
if(/\s(\[a-zA-Z]+),/){ #匹配空白符和逗号间的单词print "the word was $1\n";
}if(/(\S+) (\S+), (\S+)/){print "words are $1 $2 $3\n";
}my $names = 'fred or barney';
if($names =~ /(\w+) (or|and) (\w+)/){say "I saw $1 and $3";
}
捕获变量的存续期
匹配才改变内容,不匹配还是原来的内容
if($pjx =~ /([a-zA-Z]+)/){print "pjx is $1\n";
}else{print "pjx have no word\n";
}#复制给变量长期使用
if($pjx =~ /([a-zA-Z]+)/){my $var = $1;...
}
不捕获模式?:
# 用?:来表示这对括号内只是分组,而非捕获
if(/(?:bronto)?sarus (steak|buger)/){print "Fred wants a $1\n"; #捕获第二个括号
}
#建议尽可能用非捕获括号来分组
自动捕获变量
速度拖慢,常用于正则表达式中的替换操作
$& 匹配内容
$` 匹配区段前的内容
$' 匹配区段后的内容if("hello there, neighbor" =~ /\s(\w+),/){print "that was $` $& $'.\n"; #分别对应原三个单词
}
通用量词
/a{5,10}/ #匹配5-10个a
/(fred){3,}/ #匹配3个以上fred
/(ged){8}/ #刚好匹配8个
--------- 第九章 用正则表达式处理文本 -----
s///
替换
$_ = "he's out bowling with barney tonight";
s/barney/fred/;
print "$_\n";
s/with (\w+)/against $1's team/; #替换为捕获
print "$_\n";if(s/out/in/) #返回布尔值# 除s//外,其他定界符
非成对字符 s#^https://#http://#;
成对字符 s{fred}{barney}; s<fred>(barney)
/g
全局替换
$_ = "home, sweet home!";
s/home/cave/g;
print "$_\n";#常用于缩减空白
$_ = "input data\t may have extra whitespace";
s/\s+/ /g;#删除开头和结尾的空白
s/^\s+//;
s/\s+$//;
s/^\s+|\s+$//g; #一次到位#其他替换修饰符
/i 无关大小写 s/wilma/WILMA/gi
/x 加入任何空白
/s 任意字符(包括换行)
绑定操作符
$file_name =~ s/^.*//s;
无损替换
同时保留原始的和替换后的字符串
my $original = 'fred ate 1 rib';
my $original2 = 'fred ate 1 rib';
(my $copy = $original) =~ s/\d+ ribs?/10 ribs/;
#加括号先赋值后替换,返回成功替换的次数??
my $copy2 = $original2 =~ s/\d+ ribs?/10 ribs/r;
#不加括号先替换后赋值,加\r修饰符,返回替换的结果??
print "$original\n$copy\n";
print "$original2\n$copy2\n";#输出结果一样啊:
fred ate 1 rib
fred ate 10 ribs
fred ate 1 rib
fred ate 10 ribs
大小写转换
\U 其后所有字符转换成大写
\L 其后所有字符转换成小写
\u 其后第一个字符转换成大写
\l 其后第一个字符转换成小写
\E 关闭大小写转换$_ = "I saw Barney with Fred.";
s/(fred|barney)/\U$1/gi;
s/(fred|barney)/\L$1/gi;
s/(\w+) with (\w+)/\U$2\E with $1/i;
s/(fred|barney)/\u$1/gi;
s/(fred|barney)/\u\L$1/gi; #首字母大写#注:以上转换方法同样可用在任何双引号内的字符串:
print "\L\u$name\E, are you ok?";
split操作符
my @files = split /\s+/, $_; #等同于split/\s+/
my @files = split/\t/, $_, 2; #只拆分为2段my @fields = split/:/, "ab:db::e"; # 会产生一个空字段
my @fields = split /:/, "::ab:cd:::"; #前面的空字段保留,后面的会省去
join函数
与split相反
my $result = join $glue, @pieces; #glue可以是任意字符串
my $x = join ";", 4,6,7,8,9; # 4;6;7;8;9
my $y = join "foo", "bar,gre"; #barfoogre
my @value = split /;/, $x;
my $z = join "-", @value; #4-6-7-8-9
列表上下文中的匹配
不要与上面的s///(返回次数)混淆了
my $text = "fred a 5 ton Mr. Slate";
my @words = ($text =~ /([a-z]+)/ig);
print "result: @words\n"; #fred a ton Mr Slatemy $data = "barney rubble fred Flid Wilm fint";
my %name = ($data =~ /(\w+)\s+(\w+)/g); #每次捕获一对值,生成hash键值对
非贪婪量词
$test = "this the is a the is a test";
$test =~ s/the (.*?) a/$1/g;+?
*?
{5,10}?
{8,}?
?? #问号本身的非贪婪,即在0或1的情况下匹配0次
跨行模式匹配
/m
Perl时间函数
my $date = `date`;
my $date = localtime;
转载于:https://www.cnblogs.com/jessepeng/p/10962651.html
Perl 语言入门6-9相关推荐
- Learning Perl(Perl语言入门)学习笔记(3)
第四章 子例程 1. 子例程(subroutine)即用户自定义函数,子例程调用时通常在子例程名前加上"&"符号:子例程名属于独立的命名空间: 2. 子例程可以在程 ...
- 开发日记-20190710 关键词 读书笔记 《Perl语言入门》Day 7
Preface Content 用m//进行匹配 我们用双斜线的写法表示模式,比如/fred/.但事实上,这是m//(pattern match operator,模式匹配操作符)的简写. 但是尖括号 ...
- 开发日记-20190708 关键词 读书笔记 《Perl语言入门》Day 5
Preface 进度两章,看来搞定这本书真的是需要话一些时间的.十天左右吧.怪我没弄实体书呗. Content 我们已见过并用过一些内置的系统函数,像chomp,reverse和print等. 但是, ...
- 开发日记-20190706 关键词 读书笔记 《Perl语言入门》Day 3
Preface 感觉Perl上下文的概念其实挺有意思的,有点像大陆法系和英美法系之间的关系那样扑朔迷离.Perl的感觉在目前给我的感觉是,他更相信人,他认为只要是实际的操作者用的更爽,那这个东西就是最 ...
- 读书笔记 《Perl语言入门》 Day 1
Preface 给我三天,我搞定Perl基础,毕竟是从C过来的(虽然C学的不咋滴= =). Larry为什么要创造Perl? 20世纪80年代中期,Larry想要为类似新闻组的文件体系写一个bug汇报 ...
- 开发日记-20190705 关键词 读书笔记 《Perl语言入门》Day 2
Preface Content 运行程序时,Perl内部的编译器会先载入整个源程序,将之转换成内部使用的bytecode,这是一种Prel在内部用来表示程序语法树的数据结构,然后交给Perl的byte ...
- 开发日记-20190716 关键词 读书笔记 《Perl语言入门》Day 10
文件测试操作符及其意义 文件测试操作符 意义 -r 文件或目录,对目前(有效的)用户或组来说是可读的 -w 文件或目录,对目前(有效的)用户或组来说是可写的 -x 文件或目录,对目前(有效的)用户或组 ...
- 开发日记-20190709 关键词 读书笔记 《Perl语言入门》Day 6
Preface 麻麻,今天Perl进度推进了两章,Linux进度推进了一章,我这下班进度.高起来我自己都吓一跳.早点睡觉吧!还有,用知识武装自己,而不是欲望. Content 什么是正则表达式? 正则 ...
- 开发日记-20190707 关键词 读书笔记 《Perl语言入门》Day 4
Preface 呵,这脸打的真的是啪啪直响,我自己说的话其实我自己是记得最清楚的.今天都已经是第四天了,进度也只到第三章,真的,还是待在公司最有感觉. Content 自己写了一遍第三章的答案,然后对 ...
最新文章
- 高翔博士SLAMBOO2十二讲代码库中的三方库没有下载下来 ,需要手动对三方库单独下载的git的命令如下
- python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐
- UVA 1324 The Largest Clique 最大团(强连通分量,变形)
- 【论文分享】ACL 2020 多模态相关任务分享
- mysql教程 触发器_实现MySQL触发器的实际操作步骤
- LEDE独臂路由器无法上网踩坑
- 【已解决】vue项目地址栏的图标不显示
- 想以游戏纸娃娃系统专利主张暴雪的暗黑3侵权? 先过暗黑2这关!
- [闲聊篇]这个世界所谓的28定律
- 【算法+LeetCode题解+剑指Offer题解】算法思想、排序搜索、数据结构、数学、特殊解法、设计(全总结)
- 计算机科学的中心舞台在于,【名师】上海财经大学教授陆品燕:以赤子之心长者之智,打造国际一流理论计算机科学研究中心...
- 【Python】星号与双星号
- html5 we3c,TWDDMM8DRT供应
- 校园二手书微信小程序,校园二手书交易小程序,微信小程序二手书交易系统毕业设计作品
- mac安装Solr流程
- python报错:使用lgb过程中报错:DataFrame.dtypes for data must be int, float or bool
- HTML5 新标签section使用
- Lua C接口编程(二)
- pinyin4j NullPointerException: null空指针异常
- ​公司福利 | 炎炎夏日下的一盒水果暖心窝
热门文章
- ubuntu下使用apt安装mysql_Ubuntu下通过apt包管理安装mysql
- 【宜搭客户说第二期】宜搭助力跨境金融行业实现数字化管理
- 程序员的未来真的一片阴霾吗,大厂女程序员从未摆脱焦虑
- DB-Engines 3月数据库排行:排名前十数据库七成分数下降
- 放置等于弃置?放置类游戏是否是市场下一个风口?
- 《糖豆人:终极淘汰赛》:如何打造最难关卡「水涨爬高」
- php绘制奥运五环(GD)
- 常见Java面试题 BIO、NIO、AIO 有什么区别?
- 蓝色版苹果iPhone 12开箱上手视频流出;谷歌回应司法部反垄断诉讼:存在严重漏洞;​Git 2.29 稳定版发布|极客头条
- Integration testing