存档

文章标签 ‘Perl’

一个匹配质数的perl正则表达式的分析

2012年1月5日 没有评论

  网上有个牛人老外,用perl写了个匹配质数的正则表达式,就像这样:

perl -lne '(1x$_) =~ /^1?$|^(11+?)\1+$/ || print "$_ is prime"'

,这是个交互式的东东,运行后得你手工输入数值,脚本判断是否是质数,是就打印说啥啥是质数。这句简单的代码我仔细分析了下,终于大概弄懂了。首先,是把你输入的数,转换成输入数值个1的字串,然后进行匹配,匹配不上,则输入的数为质数。匹配的正则表达式又是两个表达式的合集(两个表达式是的关系)。
  第一个正则匹配表达式很简单:“

^1?$

”,就是用来匹配0个或1个”1″,也就是这两个数(0和1不是质数),关键在于第二个正则表达式:

^(11+?)\1+$

,显然3(字串是111)、5(字串是11111)匹配不了,是质数;4(爱传是1111)和6(字串是111111)能匹配上,是合数。至于其中寻找质数的逻辑,我也大概弄明白了,比如说,数字7,字串是1111111,匹配11(11)+匹配不了,尝试111(111)+也不行,1111(1111)+也不行,所以是质数;同理,数字9,字串是111111111,匹配11(11)+匹配不上,但是匹配111(111)+可以,所以9是质数。

分类: tips 标签: ,

apache里用cgi方式执行perl程序,其CGI模块会影响apache的charset

2011年9月14日 没有评论

  最近在搞rackmonkey的中文问题,本来大家都用utf8编码就啥事儿没有了的。于是就在apache里强制AddDefaultCharset UTF-8,可相当诡异的是,页面输出的时候还是直接跳到iso-8859-1去了,抓了下头,才知道原来apache直接送出一个http头,说“charset=ISO-8859-1”,害得我查半天,最早以为是http认证那块儿改了charset设置,注释掉也不行,最后才搞明白原来这个头是perl程序吐出来的,再大概一翻代码,原来perl程序使用了CGI模块儿,看了下CGI的文档,原来找个模块缺省是吐“charset=ISO-8859-1”的,这样一来,问题好解决了,在程序里调用cgi->header的地方指定charset,或者釜底抽薪,直接将其调用的CGI模块改了,将charset的缺省值改成“UTF-8”,问题即解决。

关于rackmonkey的支持中文

2011年9月13日 没有评论

rackmonkey不错,唯一的问题在于其不支持中文,存进去的中文会乱码。假期几天看了看代码,发现这个问题也很好解决。
我大概做了4个改动以实现可以往库里存中文并正常显示的功能。
1,my.cnf
里面加了句:

init_connect='SET NAMES utf8'

2,apache配置文件(可选的)

AddDefaultCharset UTF-8

3,源码文件rackmonkey.pl

$note = encode_entities($note);

改成

$note = encode_entities($note,'<>&"');

4,源代码文件RackMonkey/CGI.pm

return $self->cgi->header($type);

改成

return $self->cgi->header(
                        -type   => $type,
                        -charset=> 'utf-8');
分类: tips 标签: , ,

改了一个nagios plugin:check_mem.pl

2010年11月27日 没有评论

  这个check_mem.pl其实不仅仅是个nagios插件(plugin),而且还是nrpe的插件(plugin),而且还带性能数据。原版的程序是将bufferscached的内存(free命令看到的)加在一起当做caches的内存,然后当做性能数据caches打印出来的。为了更加直观,我还是将其改回去了,把caches内存还是拆成cachedbuffers两部分,并都在性能数据中输出。

  对啦,这个程序在solaris下跑也许会有bug,主要是我对solaris下的内存划分还没做太多研究,原来的程序就支持solaris,我就把原来的代码做了些许改动。

  就这些了。代码在这里(https://github.com/haw-haw/some-nagios-plugins/blob/master/check_mem.pl)

用perl模块儿HTML::TreeBuilder::XPath从网页上抓数据

2010年5月31日 没有评论

perl上的好东西可真多呀
前段时间也搞了个抓东西的东东
但那个没用到HTML::TreeBuilder::XPath这个模块儿
这次我把HTML::TreeBuilder::XPath用来抓lego的一些数据
简直是太好用了!
不得不服:perl上的好东西太多了!
至于怎样获得要抓数据的Xpath
按照大多数人的搞法,用firefox(含插件FireXPath)+firebug
我也差不多是这么干的
用fireXPath找到XPath
然后稍作修改就拿来用的
代码呢
写的太臭
就不贴在这里了

分类: Programe 标签: , , , , ,

强制CGIProxy支持SSL

2010年4月20日 没有评论

CGIProxy是一个perl写的在线代理软件
通常只要系统装有openssl和perl模块儿Net::SSLeay
CGIProxy就支持SSL的
但是
如果CGIProxy没有跑在secure server上
也就是不是https,而仅是http的话
会出错,提示如下:

Retrieval of secure URLs through a non-secure proxy is forbidden.

我的web服务器是不支持https(关键是要支持的话要另花钱:)的
但好在系统上是有openssl和Net::SSLeay的
打开nph-proxy.cgi看看代码
将$OVERRIDE_SECURIT设成1就好了
像这样:

$OVERRIDE_SECURITY= 1 ;

使用perl中函数sysopen的一个弱智问题

2009年12月30日 没有评论

闲暇无聊学着写过一个perl程序
用来从网上抓点东西下来
再改吧改吧,存到本地的文件里
最早打开文件用的是open
但后来为了直接在open时就设定打开的文件的权限
就改用sysopen
像这样:

my $save_u = umask();
umask(0);
if (sysopen(FH, $path, O_RDWR|O_CREAT, $fmode)) {
print FH ($data);
close(FH);
} else {
print “Couldn’t open $path for writing:$!
\n”;
return 2;
}
umask($save_u);

但后来发现写入的文件尾巴上老有点问题
最开始老以为是某个替换内容用的正则表达式有问题
但查了半天都没查出来为什么
把每一个正则替换前后的数据都打印出来了没发现问题
最后甚至于把写到文件里去的数据打出来
还是没发现问题
最后就只有落到sysopen这里
认为是写错了
最后把sysopen那一行改成

if (sysopen(FH, $path, O_WRONLY|O_CREAT|O_TRUNC, $fmode)) {

这下终于好了
不过到今天才真正想明白为什么出问题
是因为sysopen时少了个参数O_TRUNC
这样的话打开的文件原来存在的话
没有执行truncate工作
直接从前往后写
也就是覆盖原来的内容
这种情况下
如果新内容比老内容多的话不会出问题
因为原来所有的内容都给覆盖掉了
可万一新内容比旧内容少的时候
就会留下老内容的一段尾巴
所以我们从页面上看老是尾巴上多一点东西
至于O_RDWR改成O_WRONLY则是非必须的
原因是为什么呢
这是因为打开原来存在的文件的时候没有truncate掉原来的内容
所以写到最后一段
如果没内容写了
那么原来文件的最后一部分就留下了
所以呢解决的方法很简单
在sysopen的option参数中加上O_TRUNC即可

perl程序出”Unknown encoding: gb18030″错的问题

2009年12月1日 1 条评论

写了个简单的perl程序
用来转码(gbk->utf8,utf8->gbk)之类
其中涌到了perl包Encode
发现个问题
当调用Encode包中的方法decode的时候,出错了
代码是这么写的
$html = decode($charset, $html);
当执行到这里的时候就报错:

Unknown encoding: gb18030

上面代码里的$charset是通过Encode::Detect::Detector->detect方法检测到的某个文件的编码
这里是gb18030

最后是怎么解决的呢
装了个perl包:Encode::HanExtra
并在程序里加上

use Encode::HanExtra;

问题就解决了

How do I extract URLs from html?

2009年11月23日 没有评论

perl的faq第九节有个简洁的例子

#!/usr/bin/perl -n00
# qxurl – tchrist@perl.com
print “$2\n” while m{
< \s* A \s+ HREF \s* = \s* ([“‘]) (.*?) \1 \s* >
}gsix;

这个正则表达式相当简单实用
但是实际上有点问题
比如
<a href=”xxxxxxx” target=”_blank”>
这样的html代码
就会匹配出xxxxxxx” target=”_blank
这显然不行
于是做了小小的改动:

#!/usr/bin/perl -n00
# qxurl – tchrist@perl.com
print “$2\n” while m{
< \s* A \s+ HREF \s* = \s* ([“‘]) (.*?) \1 \s* [^>]*
\s* >
}gsix;

这样就没问题了

用Net::SSH::Perl连服务器巨慢……

2009年2月4日 1 条评论

工作上需要个脚本连服务器
本想用python
但是貌似python的那个ssh模块儿只支持ssh2
而我们有好多还是跑的ssh1
故而使用了perl
perl的模块儿Net::SSH::Perl倒是ssh1、ssh2大小通吃
但是也有个问题
连ssh2的时候
速度巨慢
google了一下
网上有人说是因为少装了个模块儿:Math::BigInt::GMP
导致和sshd服务器端交换key的时候计算非常慢
同时,还提到2个perl模块儿:YAMLMath::BigInt
说也需要
于是我就装上了
再一跑程序
果然是快了不少