Category Archives: Perl学习笔记

Pelrun [实战2]

在Perlrun实战[1] 中我们提到了可以使用下面的命令来得到Query Type的平均执行时间: cat logfile | perl -ne ‘/[QueryType=([^]]+).+[TimeCost=([d.]+)ms/; $QT{$1} +=$2; $CNT{$1}++; END{for $key (keys(%QT)) {print $key, ": ", $QT{$key}/$CNT{$key},"n" } }’ | sort 这里使用了END,我们再来看这样一个需求。我们要得到每种QueryType的时间消耗的分布: -bash-3.00$ cat logfile | perl -lne  ‘$total += $2; $time{$1} += $2 if /[QueryType=([^]]+).+[TimeCost=([d.]+)ms/ } … 繼續閱讀

发表在 Perl学习笔记 | 发表评论

Perl学习笔记 — Find Rare Item[解答篇]

记得很久很久以前发了一个帖子,出了一道题目,当时我花了好几十行代码才完成的工作,Todd用2行代码就完成了,今天来总结一下。题目的需求是找出一个Category里面最特别的物品。我们的做法是把一个Category里面所有的物品的标题都打印出来: 算法描述: 统计所有的单词的出现频率。比如watch:30次,ring:20次,book:15次,blue:6次 给每一件物品打分,score=SUM(Freq. of word in Title)。就是把该物品的标题的单词一个一个拿出来,如果是watch,就加30分,如果是ring,就加20分… 给所有的物品按照分数排序,得分就少的物品就是特别的物品。 O.K.我们这里不讨论算法,只学习perl的使用技巧。怎么实现上面的算法?先来看看数据: 原始实验数据: Version:0.1MatchCount:10000…ReturnCount:50110175200       Perot by  Tod Mason145230996       TOD OLDHAM petite vest — beautiful and rare16F44B046       2 Life / Death aus Apokalypse !! Leben / Tod18B1714EB       Insel-Buch 1 Die Weise von Liebe … 繼續閱讀

发表在 Perl学习笔记 | 2条评论

Perlrun 学习笔记[实战]

预备知识:我们有一个HTTP Server响应请求。为了方便tracking,我们保存所有的query在acess log文件中。现在想一下需要log多少信息。 Query String 这样出了问题我们才能replay这些query用于重现。[Query=] IP 这样我们可以知道是谁发送了query,如何是恶意发送大量expensive query企图拖垮我们的系统,我们可以禁掉该IP。[IP=] Process Time 每一条query的执行时间,方便我们定位哪些query比较昂贵。[TimeCost=] Response Size 记录每一条query数据的多少。有时候会发现网络流量很高,会怀疑是不是有大量的数据交换。[RespSize=] QueryArriveTime 记录query到达时间,比如发现10点到11点之间HTTPD CPU很高,可以抽取该时间段的log。[ArrTime=] Query Type 这是根据业务划分的。有了这个信息可以帮助我们聚类。[QueryType] … … 我们可以根据需求添加更多的需要log的信息,只要能够帮助我们分析。好了,有了以上的介绍我们基本上知道 access.log文件用于记录到达的query,文件中的每一行对应一条query,每一行样子都是这个样子的: [ArrTime=Fri Sep 26 00:00:30 2008][IP=10.254.11.123][Query=...][QueryType=Batch][TimeCost=8.22ms][RespSize=8][...]表示:在0点从ip=10.254.11.123处发来一条query,该query是取信息给batch应用使用的。耗时8.22毫秒,返回页面大小为8K。 好!现在的问题就是当问题出现的时候,如何在浩瀚的access log文件中找到线索。perl派用场的时候到了。 查看Sep 26号的11点到12点之间的请求类型的分布。grep ‘[ArrTime=Fri Sep 26 11′ access.log | … 繼續閱讀

发表在 Perl学习笔记 | 发表评论

Perlrun 学习笔记[简介]

通常我们运行perl的方式是写一个perl脚本,然后运行(比如perl perlscriptfilename.pl)。但是很多情况下,我们希望更加快捷的方式,把perl脚本写在命令行里面直接运行。这种做法在我们的日常工作中常常碰到。举一个实际的例子,在production的机器上只安装了vi,vi有一个缺陷,如果文件中有的行特别长,vi就不能正常工作。现在我们要修改一个配置,把arrowpig=smart改成arrowpig=fool perl -pi -e ‘s/arrowpig=smart/arrowpig=fool/’  config_filename 我们可以使用perldoc perlrun查看帮助。所有以这种命令行内嵌脚本方式运行的perl都要指定-e选项。这里的-p讲究很大,为什么命令行内嵌perl命令这么简介,其实本质上它是最常见的处理代码模板预定义好,然后管理员只需要在命令中输入小段代码,perl会自动将输入的代码插入到模板中去,然后运行。比如上面的这条替代命令。它相当去打开configuration_filename, 然后顺序读入每一行,看看有没有匹配字符串arrowpig=smart,如果有就替换成arrowpig=fool,然后将处理后的每一行写到一个新文件,最后将新文件覆盖原始文件。这样就完成了配置的修改。 我们先来看-p, 使用-p就相当于选择了下面的程序模板: while (<>) {… # 我们填入的小段代码就被插入到这里 } continue  #continue代码块中的内容在下一次while()中的内容被evaluation之前执行{ print;   #打印默认值$_} 如果我们使用perldoc perlop查看在线帮助,我们就知道while(<>){    #这里是对每一行的处理代码}实际上相当于:unshift(@ARGV, ‘-’) unless @ARGV;  # @ARGV是输入参数列表,在arrowpig这个例子中就是只有一个参数config_filenamewhile ($ARGV = shift)                    # 依次取出每一个输入参数,如果是’-’就认为是标准输入。{    open(ARGV, $ARGV);                # 打开文件,如果没有输入参数,就相当于打开标准输入,$ARGV中保存文件句柄    while … 繼續閱讀

发表在 Perl学习笔记 | 1条评论

Perl学习笔记 — 书到用时方恨少

现在是晚上10点,我还在单位里面,为什么会这么晚呢,因为自己太弱了!!4月10号凌晨一台机器Machine Restart,祸不单行,重启以后由于NTP服务也down 掉了,搞得系统时间比正确时间快了1个小时。由于我们在这台机器上面部署的Application运行的时候都依赖于系统时间,搞得应用进程跳过当前时间,不停的试图处理将来的数据。为了恢复这个问题,需要找到系统时间出错前应用进程的所有任务的时间戳,然后从那些时间戳replay所有任务。 每个物理服务器上可以部署多个进程,进程是由VCS监控的,所以进程是可以从一台机器“飘移”到另外一台机器的。 每个进程启动的时候,都会打印"Process Started"到logging 文件。 每个进程都并发多个任务,每个任务由一个线程执行,线程启动时会记录任务名称和线程ID到logging文件。 每个任务都是执行N个步骤,每个步骤调用一个函数,函数调用也都logging。 每个任务都是循环执行的,执行完本轮的所有步骤以后,休息一段时间,下一轮继续执行。 关于以上4点的说明: 所有进程漂移的动作都由VCS的系统日志记录。 由于各种原因应用进程会重新启动,这时每个任务重新初始化,线程ID很有可能会变动。 假设任务名称是Task1,线程ID是35,当前系统时间是Thu Apr 10 01:44:29 2008,logging格式为:{Task1} [TID: 35] Init at (Thu Apr 10 01:44:29 2008) 假设步骤名称(函数名称)是Step1,当前系统时间是Thu Apr 10 01:56:30 2008, logging格式为: [TID: 35] Step1 at (Thu Apr 10 … 繼續閱讀

发表在 Perl学习笔记 | 1条评论

Perl学习笔记–Building a RegExp

爸爸妈妈回家了,早上带了一个白馒头一包牛奶,中午带了是周末自己烧的菜剩下的,晚上本想回家吃妈妈给我准备的馄饨的,可是我现在还在单位里面,刚才和同事去大大点了一个豆皮牛肉。今天看了一个设计文档,是关于怎么设计一个数据库表来模拟配置环境的,觉得设计的挺好的,估计能和数据库原理那本书对上。看了一天,头有点大,回家前写篇Perl学习笔记吧,就当翻译作业好了。Todd在公司Wiki上建了一个Page,里面有他写的一些很实用的脚本,以后再学。 目的:匹配数字(Numeric),可以是整型,可以是浮点,可以是科学计数,有可能带正负号。 我先摘录一下整体思路,这个思路不限于匹配数字,这是一个构建正则 表达式的通用思路: 详细的表述需求(Specify the tasks in detail) 把问题分解成子问题(Breaking down the problem into smaller parts) 把子问题用正则表达式表示出来(Translating the small parts into regexps) 整合用于解决子问题的正则表达式(Combining the regexps) 优化整个后的结果(Optimizing the final combined regexp) 其实很多东西都是相通的,所以要多学涉猎一些学科。上面提出来的5个步骤在算法导论中也提到过,这就是典型的Divide and Conquer的思路。或许现实生活中碰到的很多问题也是这样的思路呢。好了,不说废话了,我们一步步来: Step1:在目的里面已经比较详细了,再补充一点,我们还可以换一个角度考虑,有时候不能正面表述一个事物的时候可以用反面来描述,比如,匹配数字就意味着不能匹配字符串! Step2:子问题再目的中也给的比较明确,一共就两类,整数和浮点数,每一类都有可能是使用科学计数法的,有可能是带正负号的。而且正负号一定出现在开头/^/,而指数部分一定出现在结尾/$/。 Step3:正负号是可选的,所以是/[+-]?/。整数的表达是/d+/。小数比较复杂,有3种形式,比如12., .12, 1.2 。对应这3种情况,分别写出正则表达式: /d+./, … 繼續閱讀

发表在 Perl学习笔记 | 发表评论

Perl学习笔记–Matching Principles

Perl就像一把瑞士军刀,临战时用起来很方便。特别在文本处理的时候,比如在大型系统中追踪问题常常以来于系统日志,我们有很多日志,access_log或者err_log或者deploy_log。今天我一边看剧场版的名侦探柯南,一边看了一下Perl的正则表达式匹配的文档,写点笔记,也算这个周末没有完全堕落啊。 先看一个小例子: "abcde"=~/(abd|abc)(df|d|de)/;意思是匹配的部分有两部分(two groups)组成,第一部分(group)有两种可能(alternatives)分别是abd和abc,第二部分是df或者d或者de。那Perl内部在匹配的时候是经历的怎样一个过程呢? 从字符串的第一个字符a开始考察。 拿出正则表达式第一部分的第一个选择abd试图匹配。 前两个字符ab,恩,so far so good。 可是abd中的d并不匹配abcde中的c。匹配失败,回退(backtrack)2个字符,用正则表达式第一部分的第二个选择abc来重新进行匹配。 abc都匹配上了。正则表达式第一部分完成匹配。把$1设成’abc’。 现在从第二部分中取出第一种可能df。 d匹配了。 可惜f和e不匹配。回退(backtrack)1个字符,拿出第二种可能d试图匹配。 d匹配上了,所以第二部分(group)匹配完成。设置$2=’d’。 我们已经到达正则表达式的结束位置,此次匹配全部完成了。我们在字符串’abcde’中匹配了子串’abcd’。 在Windows XP的cmd下面验证一下: C:>perl -e "print qq{$1,$2} if q{abcde}=~/(abd|abc)(df|d|de)/" abc,d 这里要注意几点: 正则表达式第二部分的de也能匹配。但是在de之前的d已经能够匹配了,de就没有机会了。这里有个原则,在给定位置的点,碰到用|分隔的多种可能性时,优先考虑左边的选项(alternative)。诶,这句话我不知道怎样翻译比较好,还是给原文吧:at a given character position, leftmost wins! 稍许再解释一下backtrack的概念。其实backtrack来自于这样的想法:说正则表达式匹配的过程啊就像是在走迷宫。如果成功匹配呢,就是你成功的走出了迷宫,只有你尝试了每一条可能的路径都走不出去,才能说匹配失败。假设你现在处在A点,你前面有好几种选择,走哪一条路呢,这种情况就是grouping里面有多种alternatives的情况,比如(abd|abc)。Perl总是优先选择leftmost path,这里就是abd,并且成功的向前走了两个格子(2 characters),当它发现第三个格子d不匹配的时候,就要回退到上一个成功的点,A点,这里就是字符串开头。这个回退的过程,就叫做backtrack。 现在我们知道在正则匹配的时候是有一些原则的,比如这里的left most。那我们再看一个例子: $x="The … 繼續閱讀

发表在 Perl学习笔记 | 5条评论