Preface

明天就是Fate大电影上映的时间了,好激动= =


Content

列表上下文的m//

在使用split时,模式指定的正是分隔符:分解得到的字段未必就是我们需要的数据。有时候,指定想要留下的部分反而比较简单。

在列表上下文中使用模式匹配操作符(m//)时,如果模式匹配不成功,那么返回的是所有捕获变量的列表:如果匹配失败,则会返回空列表:

$_ = 'Hello there,neighbor!';
my($first,$second,$third) = /(\S+) (\S+), (\S+)/;
print "$second is my $third\n";
my $test = 'Fred dropped a 5 ton granite block on Mr.Slate';
my @words = ($text =~ /([a-z]+)/ig);
print 'Result: @words\n';

事实上,如果模式中有多组圆括号,那么每次匹配就能捕获多个字符串。假设我们想把一个字符串变成哈希,就可以这样做:

my $data = 'Barney Rubble Fred Flintstone Wilma Flintstone';
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);

每次模式匹配成功,就会返回一对被捕获的值,而这一对值正好成为新哈希的键值对。

非贪婪量词

目前位置,我们看到的四个量词全部都是贪婪(greedy)量词,也就说,在保证整体匹配的前提下,它们会尽量匹配长字符串,实在不行才会突出一点。比如以/fred.+barney/匹配fred and barney went bowling last night这个字符串。我们可以一眼看出来会匹配成功,但现在,我们要深入了解一下匹配的过程中到底发生了什么事情。首先,模式中的fred部分将会逐字匹配与其相同的字符串。模式的下个部分是.+,它会匹配换行符之外的所有字符(至少一次)。但加号是个贪婪量词,它会尽量匹配最多的字符串。所以,进行到此,它会一口气吞掉字符串剩下的所有内容,一路到最后的nigfht。

现在轮到模式中的barney部分,但它已经没办法进行匹配,因为刚才已经进行的字符串的末尾。由于.+就算少匹配一个字符也算匹配成功,所以它打算往后退一步看看,于是突出最后匹配到的字符t。(虽然它很贪婪,不过为了顾全大局,并让整体模式尽可能匹配成功,所以就算自己没有匹配到全部字符串也可以忍受。)

现在又轮到barrney部分进行匹配,但还是无法成功。因此,.+再次突出一个字符h试试看。就这样一个字符一个字符地,.+匹配的部分一路减少到了barney之前。刺客,模式中的barney部分终于能够匹配成功,于是整个模式也就匹配成功了。

正则表达式引擎会一直进行上述的回溯(backtracing)动作,不断地以不同的方式调整模式匹配的内容来适应字符串,直到最终找到一个整体匹配成功的为止,要是直到最后都找不到就宣言失败。从这个资历我们可以知道回溯的动作可能非常繁琐,因为量词囫囵吞枣吞下的字符串太长,于是正则表达式引擎不得不使它逐个吐出来。

不过,每个贪婪量词都有一个非贪婪版本。以加号(+)为例,我们可以改用非贪婪的量词+?。这除了表示一次或多次(也就是加号本身的意义)之外,同时要求能匹配的字符串越短越好,而不再是越长越好。现在我们把刚才的模式改成/fred.+?barney/,看看这个新量词是如何运行的。


Daily Task

终有一天,你的生命将会抵达终点,而我。

开发日记-20190712 关键词 读书笔记 《Perl语言入门》Day 8相关推荐

  1. 开发日记-20190710 关键词 读书笔记 《Perl语言入门》Day 7

    Preface Content 用m//进行匹配 我们用双斜线的写法表示模式,比如/fred/.但事实上,这是m//(pattern match operator,模式匹配操作符)的简写. 但是尖括号 ...

  2. 开发日记-20190708 关键词 读书笔记 《Perl语言入门》Day 5

    Preface 进度两章,看来搞定这本书真的是需要话一些时间的.十天左右吧.怪我没弄实体书呗. Content 我们已见过并用过一些内置的系统函数,像chomp,reverse和print等. 但是, ...

  3. 开发日记-20190706 关键词 读书笔记 《Perl语言入门》Day 3

    Preface 感觉Perl上下文的概念其实挺有意思的,有点像大陆法系和英美法系之间的关系那样扑朔迷离.Perl的感觉在目前给我的感觉是,他更相信人,他认为只要是实际的操作者用的更爽,那这个东西就是最 ...

  4. 开发日记-20190705 关键词 读书笔记 《Perl语言入门》Day 2

    Preface Content 运行程序时,Perl内部的编译器会先载入整个源程序,将之转换成内部使用的bytecode,这是一种Prel在内部用来表示程序语法树的数据结构,然后交给Perl的byte ...

  5. 开发日记-20190716 关键词 读书笔记 《Perl语言入门》Day 10

    文件测试操作符及其意义 文件测试操作符 意义 -r 文件或目录,对目前(有效的)用户或组来说是可读的 -w 文件或目录,对目前(有效的)用户或组来说是可写的 -x 文件或目录,对目前(有效的)用户或组 ...

  6. 开发日记-20190709 关键词 读书笔记 《Perl语言入门》Day 6

    Preface 麻麻,今天Perl进度推进了两章,Linux进度推进了一章,我这下班进度.高起来我自己都吓一跳.早点睡觉吧!还有,用知识武装自己,而不是欲望. Content 什么是正则表达式? 正则 ...

  7. 开发日记-20190707 关键词 读书笔记 《Perl语言入门》Day 4

    Preface 呵,这脸打的真的是啪啪直响,我自己说的话其实我自己是记得最清楚的.今天都已经是第四天了,进度也只到第三章,真的,还是待在公司最有感觉. Content 自己写了一遍第三章的答案,然后对 ...

  8. 开发日记-20190717 关键词 读书笔记 《Perl语言入门》Day 11

    Preface 我在想,是不是有什么东西,我渐渐忽略了自己的想法,我自己到底愿意成为自己所期望的什么样的样子,我所考虑的,是不是应该无视自己内心的那样的无可奈何的,不为人知的孤独感,我迷茫着,自己是不 ...

  9. 开发日记-20190715 关键词 读书笔记 《Perl语言入门》Day 9

    第九章习题 1.建立起一个模式,无论what的值是什么,它都可以匹配三个what的值是什么,它都可以匹配三个what的值是什么,它都可以匹配三个what的内容连在一起的字符串.也就是说,若果what的 ...

最新文章

  1. 打印表格_表格怎么打印出来
  2. 3.15计算机网络原理与技术笔记
  3. 在桌面建立快捷_用 ROX 桌面重温 Linux 历史 | Linux 中国
  4. Java – 2012年回顾和未来预测
  5. 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...
  6. 又看了半天的pdf格式的js方面的书,感觉受益匪浅啊,只会一点操作的我,要学好理论...
  7. C/C++ 格式化读取和读取一行
  8. pyecharts基础图表汇总(三国演义可视化)
  9. Mac/Win 下浏览器网页长截屏(不安装截图软件实现)
  10. 山西等保测评机构项目测评收费价格标准参考
  11. 磁盘如何除写保护(常规解决方案)
  12. Zotero+zotfile+坚果云+PDF Expert超好用的多设备协同文献管理组合(保姆级别)
  13. 大童保险发生工商变更:安信信托彻底退出,德弘资本晋升为大股东
  14. 什么是思维模型?什么是原则?
  15. 华三H3C交换机如何配置堆叠irf虚拟化之如何配置检测机制(配置BFD MAD检测)
  16. ESC云服务器搭建自己的图床
  17. 想抵御“黑客”和“黑产”,智能 + 安全能不能有高招?
  18. CCRC信息安全服务资质--软件开发-简单介绍
  19. 云计算技术-HCIA之VLAN及总结
  20. 1. 微信公众号的申请

热门文章

  1. html中和over怎么显示div,js 解决隐藏与显示div的相关问题
  2. matlab检验两个样本的,两样本独立T检验MATLAB代码
  3. 为什么linux中c语言不一样,不懂linux为什么要死守c语言。
  4. java 递归return_java递归和反向递归
  5. 各种门锁的内部结构图_双核CUP,电镀真金把手,0.3秒开锁,欧瑞博智能门锁S2评测...
  6. redis的五种存储类型的具体用法
  7. 【2021Java最新学习路线】kvm和docker区别
  8. 淘淘商城FTP服务器、Redis和solr集群配置
  9. 基础练习 龟兔赛跑预测
  10. 反射工具类 java_Java反射工具类