
Perl
文章平均质量分 69
Bai_Yuanyong
这个作者很懒,什么都没留下…
展开
-
Perl threads join 返回值
写一个多线程脚本过程中遇到一个奇怪的问题,线程的返回值总为空,仔细探究了一下,终于搞明白了原因。Perl 多线程创建过程中可以显示或者隐式的指定context,可以理解为返回值内容,如果没有显示指定则会根据脚本写法来推测返回值。看下边脚本的例子:use threads;# return scalarsub test{ return "this is testing @_\原创 2013-01-08 11:13:13 · 2630 阅读 · 0 评论 -
Perl lib path
Perl 中默认LIB路径有如下几个地方可以存储:Perl -V 中@INC变量,这是编译时绑定的系统环境变量PERL5LIB,如set PERL5LIB=D:/tmp脚本中use lib 添加所有的操作最后都是在系统变量@INC 中添加一个路径,按照先后顺序依次查找,默认的先后顺序是上边三类的倒序排列,看如下示例。没有添加额外的路径的情况:(默认当前目录会添加到LIB原创 2012-12-05 13:39:49 · 5896 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated (3 AV)
AV数组,结构如图所示:字段ALLOC 指向实际分配的SV 数组的开头地址。字段ARRAY 指向数组本身的开头地址,由于数组的改变,这个地址比起实际分配的地址,可能会产生一定的偏移。字段FILL 指向数组本身最后一个位置的偏移。字段MAX 指向分配的SV 数组最后一个位置的偏移。C:\>perl -MDevel::Pe翻译 2012-08-01 16:47:13 · 2090 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated (2 SV)
_SV_HEAD and struct sv下面来看一下最简单的类型struct sv,代表了SV,GV,CV,AV,HV,IO的通用结构。如下图所示:第一个字段Any可以指向任意结构,除了RV,所有的其他类型都是由Any指向的附加数据来实现。第二个字段REFCNT表明了有多少pointers引用了这个object。初始置为1,当有pointers指向它或者被销毁的时候,这翻译 2012-07-31 14:57:52 · 10523 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated (4 HV)
HVhash table是最复杂的数据结构,HV使用HE struct表示key/value结构,使用HEK表示key。GvSTASH 当这个hash表示一个命名空间(模块),STASH指向Perl 语法树的一个节点,用来实现reset。(略过,未搞明白)ARRAY 数组用于分配储存hash值,它的大小必须是2的n次方,当hash为空情况下,ARRAY为NULL翻译 2012-08-02 17:19:39 · 9014 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated (1)
首先看一下Perl data structure。Perl内部称为SV(scalar value), AV(array value), HV(hash value), 此外IV代表integer, NV代表double, PV代表string, RV代表指针,指向另外的任意数据结构。Perl内部的数据结构之间的关系很像OO,用C structure内存裁减的方式模拟C++的继承。各种结翻译 2012-07-31 13:59:41 · 3786 阅读 · 0 评论 -
Perl 最简单配置文件
脚本中经常需要用到配置文件,一般来说可以用INI, XML来编辑配置文件,缺点是需要按照特定的格式配以特定的解析方法,需要额外引入其他的模块或者方法。用脚本语言Perl/Python来实现的话,最简单的方法就是用另外一个脚本来存储变量,使用的时候直接引入即可。优点是不需要额外的解析方法,而且配置灵活,可以用语言本身支持的数据结构来表示各种复杂的配置。示例:config.pl%c原创 2012-08-01 15:24:38 · 3218 阅读 · 0 评论 -
Text ProgressBar
今天同事演示了一个demo,最好玩的是在字符界面下可以显示进度条,感觉很有意思,Google一下,如下为实现原理。每次输出的时候首先输出一个控制字符/r,这样就会回到这一行的行首继续输出,而不是在原先的字符串后继续输出,以下为perl & python的简单实现。Perl:---------------------------------------------$| = 1原创 2010-11-12 23:29:00 · 1782 阅读 · 2 评论 -
Perl 前缀树实现(2)
在前一篇 Perl 前缀树实现 中用hash table的方法实现了前缀树,算法导论中用数组来实现,方法基本相同,下边用链表的方法来实现,遍历算法可以用到其他树结构遍历。代码:use Data::Dumper;# 默认只支持字符串的输入sub trie_tree{ my $root = { char=>undef, next=>undef,原创 2012-07-26 22:39:51 · 1324 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated (6 CV)
CVcode value,函数的结构,如下图:下边示例可以看到几个主要参数:函数所在的Stash & GV。函数的参数表和临时变量表PADLIST。D:\Tmp>perl -MDevel::Peek -e "sub a{my ($a,$b,$t); } Dump \&a"SV = RV(0x3a90f0) at 0x3a90e4 REFCNT = 1 FLAG翻译 2012-11-21 10:17:01 · 1936 阅读 · 0 评论 -
Perl 单行编辑技巧
Perl 有一些简单的单行技巧,可以帮助很方便的实现一些文件编辑查找。介绍几个常用的方法:C:\>perl -hUsage: D:\Perl\bin\perl.exe [switches] [--] [programfile] [arguments] -0[octal] specify record separator (\0, if no argument)原创 2012-12-06 11:01:43 · 2169 阅读 · 0 评论 -
Perl Symbolic Reference
看一些模块的代码,很多时候通过*glob的方式来改变变量或者函数,这种方法称为Symbolic reference。首先看一下*glob的结构,这个在之前的博文已经讲过,不做细述:SV = PVGV(0x18d1364) at 0x182aaec REFCNT = 2 FLAGS = (IN_PAD) NAME = "test" NAMELEN = 4 GvST原创 2013-08-07 17:04:39 · 1551 阅读 · 0 评论 -
Perl Test::Unit::Lite
找了半天,终于找到一个轻量级测试框架Test::Unit::Lite,这个框架只有一个文件,不需要依赖其他文件,如果使用其他测试框架需要下载很多其他依赖模块,如果是手动下载的话基本是mission impossible。说说它的使用:首先写一个测试模块,所有的test case 都必须以test_ 开头,运行的时候并不按照编写顺序运行,而是按照字母排列顺序运行,这是和Perl 本身原创 2013-03-17 12:12:32 · 1780 阅读 · 0 评论 -
Perl 新浪股票信息收集
通过解析SINA HTTP 返回的数据获取股票信息,具体返回值参考文章实时股票数据接口大全。使用说明:perl script.pl [-c -f] -d 获取默认@defaultstock列表中股票信息,参数-c 清屏,参数-f 输出更加完整的信息,参考图例perl script.pl -m [sh sz zx cy] 四个参数分别代表获取上海,深圳,中小,创业板股票的信息原创 2012-12-21 22:22:46 · 7286 阅读 · 0 评论 -
Perl 腾讯股票信息收集
之前的新浪股票脚本信息不太全,参考前面一篇文章腾讯股票接口,写了一个更加方便的,信息比较全的。看代码:use utf8;use Encode;use strict;use warnings;use LWP::UserAgent;use threads (exit => 'threads_only',);use threads::shared;use constant UR原创 2013-01-01 15:40:03 · 10520 阅读 · 3 评论 -
腾迅股票数据接口 http/javascript
之前使用了新浪的股票数据,由于新浪http/javascript缺少一些数据,用chrome自带的开发工具监视腾迅财经HTTP信息,得到以下获取股票数据的方法。以五粮液为例,要获取最新行情,访问数据接口:http://qt.gtimg.cn/q=sz000858返回数据:v_sz000858="51~五 粮 液~000858~27.78~27.60~27.70~41原创 2012-12-21 23:48:51 · 111066 阅读 · 7 评论 -
Perl LWP&HTTP
闲来无事看了下LWP 模块,简单整理出了下图,作为一个概貌。HTTP::Message 是基类,HTTP::Request & HTTP::Response继承了它,同时他们也都用到HTTP::Header 模块。LWP 主要是UserAgent,使用它来调用get/post 发送请求,内部使用request 发送,底层使用相应的scheme如http/ftp等模块定义的request原创 2013-01-04 13:33:00 · 1239 阅读 · 0 评论 -
Perl object/bless
Perl object实际上就是一个数据结构的引用,只不过用bless把它和包绑定在一起,像类一样调用函数的过程只是从bless绑定的包中调用相应函数的过程。看下边的例子:package Test;sub new{ my $class = shift; bless {},$class;}sub test{ my $self = shift; print "this is原创 2012-12-19 14:56:21 · 2202 阅读 · 0 评论 -
Perl threads 摘要
最近又写了一个多线程的小工具,对一些多线程的使用有了进一步的心得。Perl 创建线程有两种方式,正常通过threads->create 创建线程,用async 创建一个调用匿名过程的线程,具体参考perldoc threads。线程共享变量需要使用 threads::shared,共享变量只能存储scalar,共享变量的引用,如果存储List Hash的引用需使用shared_clo原创 2012-12-27 16:37:18 · 4543 阅读 · 0 评论 -
Perl B module
Perl 脚本都是内部编译为语法树,然后根据语法树解析执行每一步。察看一个脚本的语法树用模块B::Concise,简单说明如下:B::Concise - 遍历语法树,打印每一个执行码(ops)的内容用法:perl -MO=Concise[,OPTIONS] script常用OPTIONS:-basic: 默认模式,打印内存树状结构OPs-exec: 根据执行原创 2012-12-12 14:25:55 · 1522 阅读 · 0 评论 -
Perl 内部结构详解 -- PerlGuts Illustrated
之前想看一下Perl的实现,无意中搜到了这篇文章,对Perl内部类型的结构解释的很清晰,推荐感兴趣的都仔细看一下,想优化的时候做到心中有数。接下来的几篇blog将翻译这篇文档中常见类型的部分,做个记录,加深印象,同时也方便大家阅读理解。PerlGuts Illustrated直接命令行的方法查看:perl -MDevel::Peek -e "$a = 123; Du翻译 2012-07-26 23:29:56 · 2835 阅读 · 0 评论 -
Perl 前缀树实现
前缀树,用来处理大量字符串的查找、排序,也称为字典树,可以代替hash table。http://en.wikipedia.org/wiki/Trie以下翻译自Wikipedia:The following are the main advantages of tries over binary search trees (BSTs):Looking up keys原创 2012-07-22 02:17:15 · 2668 阅读 · 1 评论 -
Perl 快排
看了下算法导论中的快排,实现方法不太一样,重新练习一下。如图为比较过程中的移动:代码:# 递归sub qsort2 { return () unless @_; ( qsort( grep { $_ < $_[0] } @_[ 1 .. $#_ ] ), $_[0], qsort( grep { $_ >= $_[原创 2012-07-18 12:51:03 · 1092 阅读 · 0 评论 -
Perl implement Tree data structure (1)
用perl实现了Tree的数据结构,使用Class::Struct来实现,以下为代码:use Data::Dumper;use Class::Struct;struct Node =>{ left => 'Node', value => '$', right => 'Node',};$root = Node->new;add($r原创 2010-12-18 03:14:00 · 997 阅读 · 0 评论 -
Perl XML::Simple parse simple xml file
用Perl解析xml文件,又不想下载其它模块如Dom,可以用XML::Simple来完成这个任务。实际工作中用到的几个有用的属性:1. KeepRoot => 1生成的hash中显示根节点,否则从下一层节点开始显示。2. ForceContent => 1生成的hash中以hash结构保存节点值,如:nodename => { content => 'value原创 2010-12-28 23:38:00 · 1835 阅读 · 0 评论 -
Perl dynamic property, method
看Mouse源代码的过程中发现perl一个很有意思的地方,可以非常方便的动态更新一个已有模块的方法或者变量,而且这个方法存在于很多其他模块中,尤其是Exporter。Example:{ package Data::Dumper; sub test{ print "testing in new\n"; }}use Data::Dumper;原创 2011-10-27 15:23:27 · 613 阅读 · 0 评论 -
Perl 闭包实现简单OO
闭包是个神奇的东西,有很多奇妙地用法,用它可以来模拟实现OO 的一些功能。以下代码用闭包和消息传递的方法实现了OO 继承,重写。有兴趣可以看看Lisp CLOS 的实现方法,参考用来模拟实现另外一种Perl OO。可以看看Meta programming,Mouse 的OO 实现部分,相信会对你有很大的帮助。sub shape { (my $newx, $newy) = @_; ret原创 2011-11-11 23:57:56 · 1062 阅读 · 0 评论 -
Perl 闭包模拟类实现二叉树
在上一篇文章中用函数方式实现了一个二叉树,本篇用闭包模拟类的方式来重新实现,不同于传统意义的Perl 类,否则也不用去费力重新实现,本篇用闭包来模拟类的一些行为,以消息传递的方式调用方法。功能同上一个版本的基本一样,是用闭包的好处:1。 模拟类行为,开放类方法2。 内部变量不可直接修改,只能通过方法调用获取或修改值3。 消息类型多样,自己可以随便控制特点:1原创 2012-07-05 15:39:14 · 1659 阅读 · 0 评论 -
Perl Socket CRLF
找一个简单的Perl Socket程序,如下Server程序,运行它 while(){ chomp; print "Message From Client: $_/n"; print CLIENT $_; }你将发现,server端程序无法发送信息到client,程序阻塞无法继续运行。解决方法:use原创 2010-08-11 16:26:00 · 1003 阅读 · 0 评论 -
Perl implement Tree data structure (2)
之前用struct实现的Tree不够灵活,重新使用hash来实现,更加灵活而且可以更改节点,进而实现平衡二叉树。以下为程序代码:use Data::Dumper;my $tree = {};add($tree,$_) for (5,7,1,4,9,6,0,9,100,20,30,21,60);print Dumper $tree;LMR($tree,$tre原创 2010-12-18 04:23:00 · 1476 阅读 · 0 评论 -
Perl 堆排序
看了算法导论堆排序,用Perl 实现一下,具体原理不解释,做个记录。代码:@a = map {int(rand 100)} 1..20;sub build_heap{ my $length = $#_; for(my $i = $length>>1; $i >= 0; $i--){ heapnify(\@_, $length, $i);原创 2012-07-15 20:38:53 · 1400 阅读 · 1 评论 -
Perl KMP 算法
了解了一下KMP 算法,自己尝试实现,也比较简单,具体原理参考google baidu,不再重复,这里只作为一个学习的纪录。use Data::Dumper;my $from = 'abababd ababc';my $find = 'ababc';# 分隔字符串为arraymy @from = split '', $from;my @find = split '', $fi原创 2012-07-11 14:55:43 · 1065 阅读 · 0 评论 -
Advanced Perl Programming 读书笔记
大概在四五年前就看过这本书,不过当时了解的还不是很深,很多概念还不明白。现如今,由于工作需要用到Perl,重新温习一下。这之间断断续续也从perldoc了解了更多的东西,有了一定的基础,很高兴当初的选择,终于有用到的时候了。Chaper 1: ReferrenceGeneral Array and Hash:@array = qw( ...... )%hash = qw(原创 2010-11-28 00:33:00 · 797 阅读 · 0 评论 -
Perl Log::FileSimple
Log是常用模块,看了下Perl自带的Log::Message模块,不太明白,从网上找了一个简单的Log模块,看下他的实现方法,可以从中学习一些方法和技巧。----------------------------------------------------------package Log::FileSimple;use 5.006;use strict;use w转载 2010-11-24 20:39:00 · 1621 阅读 · 0 评论 -
Perl 判断一个字符串中所有字符是否在另外一个字符串中出现
在酷壳 – CoolShell.cn 中看到一个文章,判断一个字符串中的所有字符是否在另外一个字符串中出现,如果用循环的话时间复杂度是O(mxn),如果使用先排序后判断时间复杂度是O(mlgm)+O(nlgn)+O(m),作者面试的时候考官给出的一个思路是每个字符给一个素数,所有的树相乘,再用这个数去除另外一个字串中字符对应的数,余数为0的话则包含在第一个字串中,时间复杂度为O(m+n),思考了以原创 2012-07-15 15:44:03 · 4952 阅读 · 0 评论 -
Perl Thread 错误避免
一个程序,如下功能,多线程同时下载多个图片并保存。具体的多线程代码片段如下:use Thread;......for my $list (@list){ print "Download begin./n"; my $thread = Thread->new(/&DownLoadFunction,$parameters); $thread->join();原创 2010-08-17 13:39:00 · 1944 阅读 · 0 评论 -
Perl 正则表达式替换
文本处理中经常需要将字符串中的某些字符替换后再进行处理,以下是新发现的非常方便的方法,充分发挥了Perl正则表达式的威力。$str = "this is a testing";$str =~ s/(/w+) (/w+)/$2 $1/;print $str;------------------------------------OUTPUT:is this a testi原创 2010-11-13 18:25:00 · 2439 阅读 · 0 评论 -
Perl Class::Struct
如果用perl来实现C的数据结构struct,请使用模块Class::Struct.以下为一简单示例:--------------------------------------------------------------------use Data::Dumper;use Class::Struct;use IO::File;struct Test =>{原创 2010-12-18 02:02:00 · 2684 阅读 · 0 评论 -
Perl Class::Accessor 分析
最近学习Perl OO, MetaClass 相关的模块,简单的分析一下Class::Accessor 这个模块。功能:自动实现字段的存取定义函数。示例:package Foo;use base qw(Class::Accessor);Foo->follow_best_practice;Foo->mk_accessors(qw(name role salary)原创 2011-10-18 16:28:10 · 1265 阅读 · 0 评论 -
Perl 二叉搜索树
用Perl 的一般方式实现了一个完整的二叉搜索树,有如下功能:1. 插入,删除,搜索2. 最大,最小值3. 某节点的前序节点,后序节点整个过程中更改了好几次:1. 增加了parent 属性,可以方便的找到父节点,有利于前序后序节点的查找。2. 最初节点不是都有left right 属性,只有在有子节点的情况下才出现,后来为了统一所有节点都加上这些属性,没有子节点的情原创 2012-07-04 23:54:54 · 1215 阅读 · 0 评论