2008年10月30日星期四

创建可传递use strict的模块

如果有一个要多次使用的模块,在文件中一般需要加入
use strict;
use warnings;
use Module_Name;

为了简化程序,可以将use strict和use warnings放到模块中传递
代码如下

package ABC;
use strict;
use warnings;
use base 'Exporter';
sub import{
strict->import;
warnings->import;
__PACKAGE__->export_to_level(1, @_);
}
1;



#!/usr/bin/perl
use feature ":5.10";
use ABC;

$undefined_var = "undefined var";



$ perl test.pl
Global symbol "$undefined_var" requires explicit package name at test.pl line 5.

Execution of test.pl aborted due to compilation errors.

2008年10月19日星期日

Joke1 The translation

版本1:你是希尔瑞斯吗?不,我是奇丁!
版本2:你是麻辣鸡丝吗?不,我是鸡丁!

原文:
Are you serious?No, I'm kidding!

2008年10月16日星期四

山地情怀中的那些bt们

无论做什么,工作学习或娱乐,总有那么一群人,很少的几个,高高在上,与众不同,以极其bt的行动散发一种光芒,挑战那些极限。我等凡夫俗子要做的,便是顶礼膜拜,加以佩服到死的神情。
正所谓高山仰止,景行行止。
在山地情怀混这么一年,丁丁和孔雀,毫无疑问的属于这些bt人种。
丁丁此人未曾谋面,但却颇有耳闻,最常的,便是在腐败桌上谈起他的饭量,山地众元老们皆以无比钦佩的口吻说到,丁丁以前和我们吃饭,一瞬间四碗下肚,然后言曰没啥菜不吃了,且最近减肥。
孔雀有和他几次骑行,最深印象是一身白肉,怎么也晒不黑。要知道玩自行车的,一天在太阳下暴晒那是经常的事,于是这群人看着都这样,把袖子和裤脚卷起,黑白分明,下部是非洲人种,被衣服遮住的部分是正常黄种人。
但孔雀不一样,怎么看都是一个纯粹的白种人,一身白肉。
其他的印象的话,像洗衣板似的一块头发挂脑后;下坡的时候,特别一次在号称南京最难的下坡光华亭,轻盈得像羽毛一样的控车,还有就是踩不死的体能。
暑假期间,我看着丁丁在小百合上的游记游记骑行青藏线,当时感觉此人果然生猛,一天200多公里不在话下,而且颇有游侠风范,随便住工地之类的地方。然而回来后,发现丁丁在情怀版面上扔地雷了
丁丁:功亏一篑的古仁拉——预告片完
一上来便是一双被废掉的脚丫子。
接下来的贴子开始介绍他在西藏的野人生活:功亏一篑的古仁拉(全文完)
这完全是一段渺无人烟的探索,5天的时间,风雪,低温,野牦牛,文中提到的重见天日的感觉,让人不由感叹这个小伙子在寻找一种怎样的生活,难道这就是挑战极限和未知的乐趣?

冰川下的自行车















从来不知道玩车可以玩到如此疯狂的地步,走完了青藏线,我如井底之蛙一样把头抬得高高,仿佛天下英雄尽止与此,然而这笔记和图片告诉我,这是没有极限的征途。我在想,面对这些未知的高山,必然险恶的环境,我有没有勇气如他一般义无反顾的一头扎进去?
这小子现在还在西藏,一座座的追寻他未曾谋面的山川,不时在山地上给我们留下他的那些足迹,感动我们这些被城市压迫的人们。
丁丁出面,孔雀也出手了。
预告片:在祁连山的心脏
bt果然是类似的,同样的一个人,同样的工作在高海拔,同样的搞死搞残
















好吧,我期待着你的续贴。

2008年10月13日星期一

在apache上运行Mod_perl

弄了半天
总算把mod_perl第一个页面配置出来了
写在这里

install忽略
1:创建Hello.pm

  package Apache2::Hello;
use strict;

use Apache2::RequestRec (); # for $r->content_type
use Apache2::RequestIO (); # for $r->puts
use Apache2::Const -compile => ':common';

sub handler {
my $r = shift;
my $time = scalar localtime();
my $package = __PACKAGE__;
$r->content_type('text/html');
$r->puts(<<"END");
<HTML><BODY>
<H3>Hello</H3> Hello from <B>$package</B>!
The time is $time.
</BODY></HTML>
END
return Apache2::Const::OK;
}
1;

2:创建startup.pl
use strict;
use lib qw(/path/to/module/);
use Apache::Hello;

$ENV{MOD_PERL} or die "not running under mod_perl!";

3:编辑apache的httpd.conf或apache2.conf
加入
PerlRequire /path/to/startup.pl

SetHandler modperl
PerlHandler Apache2::Hello

4:startup.pl和Hello.pm的位置关系
/path/to/startup.pl
/path/to/Apache2/Hello.pm

perl Moose::Cookbook::Basics::Recipe2

A simple BankAccount example

package BankAccount;
use Moose;

has 'balance' => (isa => 'Int', is => 'rw', default => 0);

sub deposit {
my ($self, $amount) = @_;
$self->balance($self->balance + $amount);
}

sub withdraw {
my ($self, $amount) = @_;
my $current_balance = $self->balance();
($current_balance >= $amount)
|| confess "Account overdrawn";
$self->balance($current_balance - $amount);
}

package CheckingAccount;
use Moose;

extends 'BankAccount';

has 'overdraft_account' => (isa => 'BankAccount', is => 'rw');

before 'withdraw' => sub {
my ($self, $amount) = @_;
my $overdraft_amount = $amount - $self->balance();
if ($self->overdraft_account && $overdraft_amount > 0) {
$self->overdraft_account->withdraw($overdraft_amount);
$self->deposit($overdraft_amount);
}
};


知识点:
属性的类型可以是另外一个类的名字
新modifier before,他在父类函数之前调用定义的sub
相当于

sub withdraw {
my ($self, $amount) = @_;
my $overdraft_amount = $amount - $self->balance();
if ($self->overdraft_account && $overdraft_amount > 0) {
$self->overdraft_account->withdraw($overdraft_amount);
$self->deposit($overdraft_amount);
}
$self->SUPER::withdraw($amount);
}

2008年10月12日星期日

perl Moose::Cookbook::Basics::Recipe1

eg:

package Point;
use Moose;

has 'x' => (isa => 'Int', is => 'rw', required => 1);
has 'y' => (isa => 'Int', is => 'rw', required => 1);

sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}

package Point3D;
use Moose;

extends 'Point';

has 'z' => (isa => 'Int', is => 'rw', required => 1);

after 'clear' => sub {
my $self = shift;
$self->z(0);
};

....

# hash or hashrefs are ok for the constructor
my $point1 = Point->new(x => 5, y => 7);
my $point2 = Point->new({x => 5, y => 7});
my $point3d = Point3D->new(x => 5, y => 42, z => -5);


和perl5里面非常相似,类都放在一个声明的package里面,use Moose自动为我们添加use strict和use Waring,同时导入缺省的函数和关键字,并自动创建构造器

第一个关键字

has 'x' => (isa => 'Int', is => 'rw', required => 1);

为类创建一个名为x的属性,isa代表这是一个Int类型的变量,rw代表可读写,required代表创建类的实例的时候,必须提供这个变量值。
之后可以创建类的方法了,它只是一个子函数而已

sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}


借着来我们定义了子类Point3D,在子类中通过关键字extend来声明父类

extends 'Point';

extends和use base的功能很像,但有点不同的是extends覆盖了@ISA数组,而use base是把参数添加到@ISA数组
接下来创建类Point3D的新属性x
has 'z' => (isa => 'Int', is => 'rw', required => 1);

这和x,y没什么区别
after关键字声明了Moose的一个特性:方法修改器
 after 'clear' => sub {
my $self = shift;
$self->z(0);
};

当从类Point3D中调用clear是,这个定义的函数会运行,之所以称为关键字after,是由于这个修改器在真正定义的函数后在被调用的。
从某种意义上来说这就是一个函数的继承

我们当然还有其他的方法做到这些,因为这是"perl"
比如:

sub clear {
my $self = shift;
$self->SUPER::clear();
$self->z(0);
}

再比如使用关键字override

override 'clear' => sub {
my $self = shift;
super();
$self->z(0);
};

据说是可以让你像ruby一样使用父类函数,可惜不懂ruby

然后就可以使用我们所写的类了

my $point1 = Point->new(x => 5, y => 7);
my $point2 = Point->new({x => 5, y => 7});

my $point3d = Point3D->new(x => 5, y => 42, z => -5);


注意:Moose里面的类都是一个hasn引用

所谓脚注:

1:Moose定义的数据类型
很多,去这里看 Moose::Util::TypeConstraints
2:Moose的extends支持多重继承
3:没看太懂,大约是使用某种方法Moose可以支持非hashref类型的类
文档支持在这里 Moose::Util::TypeConstraints

小丹阳,禄口机场,150公里

xici上的作业
http://www.xici.net/b30523/d78648713.htm

    不行了不行了,昨天回来到现在,大腿还是一直酸痛,两个月不骑退化了太多。

    总结昨天的活动,就是刷大大马路,这150公里,路况好得让人惊奇,几乎都看不到什么起伏,没有任何下坡,也就没有任何休息腿部的机会。前面三辆公路车在飞飙,后面的山地车气喘吁吁的追得辛苦。我发誓这种刷大马路的活动再也不掺和了。

    路线大约是这样的:从中华门出发,到江宁,到桃吴镇,到丹阳镇,到博望县,再到禄口机场返回。

    几点趣事:

    人数十二,三两公路,其余山地,光头胎山地胎大小不等,很不幸我看起来是车胎最粗的那位。但其中还有一个骑ATX660,这车放在5,6年前还能用吧,现在骑着咔嚓声不绝于耳,终于到小丹阳他以两年没动体力不支先回家了。
    定点腐败很成功,一堆人搞了一堆酒,就连我这两年没碰过酒精的也来了一杯。话说搞自行车的都是吃东西的猛男阿,最后一桌菜只剩下汤头,还有人意犹未尽的在里面捞残羹冷炙。
    在机场打飞机。。。好吧这很猥琐,但当时的情况就是一堆人围着飞机拍照然后叫嚣这打飞机啦打飞机啦,并很骄傲的说本次骑行名为打飞机之旅。
    哈哈哈哈,公路车在大平路上三次暴胎,我看你丫骑得快!
    伟大的西瓜,伟大的西瓜,虽然它要价两块三,一个就花了我们 24,但它在我几乎要倒下的时候赐予我力量,剩下的三十多公里一口气到屋,作用堪比兴奋剂阿。

    恩,再也不掺和这种刷大马路的事情了。

2008年10月8日星期三

windows下安装模块的一些问题

windows下面一般使用activeperl自带的ppm包来安装perl模块
但ppm提供的模块很有限而且相当的过期,所以还是使用cpan上面的包直接安装比较靠谱

1:使用nmake来代替linux make
http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe
从上面link中下载nmake15.exe,然后运行生成nmake.exe和nmake.err,将它们拷贝到perl安装目录的bin目录下面,一般是c:/perl/bin

2:使用vc的c编译器
如果是用c写成的模块,需要c编译器,一般是C:\Program Files\Microsoft Visual Studio\VC98\Bin\CL.EXE 将这个目录加入到windows的PATH变量中
具体是右键我的电脑->属性->高级->环境变量里面的系统变量

3:使用vc的库文件
perl.h需要很多库文件,在vc的include目录下,此时
运行
C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
即可是用这些文件

2008年10月5日星期日

perl tk笔记: Text widget

创建:
$text = $parent->Text( [ options ... ] )->pack;

插入内容
$text->insert('end', "To be or not to be...\nThat is the question");
最常见的用法是创建一个Text widget,把从文件读来的内容置于其中
$text = $mw->Scrolled("Text")->pack( );
open (FH, "chapter1") || die "Could not open chapter1";
while () {
$text->insert('end', $_);
}
close(FH);

一些options

line spacing
-spacing1:指定新段落前空出行的大小
-spacing2:如果一行文字超过text widget大小,则自动换行,本选项指定行与行之间的间隔
-spacing3:段落结束后行空间大小

tabs
定制tab的大小
如 -tabs =>[2,'center'] 两字符大小,后面的center是什么意思没搞明白

文本索引
定位text widget中文本位置的方法

基本索引值
n.m 第n行第m个字符,注意字符从零开始
@x.y 离坐标x,y最近的字符
end 文本结尾,\n后面
mark
tag.first
tag.last
$widget
$image: 以上两个代表widget和image的位置

索引修饰符·
+ |
- ] n [ chars | lines ]
+-n字符或行
linestart
行首
lineend
行尾
wordstart
单词开始字符
wordend
单词结束字符

关于tag
tag是预先设置的文本属性,在插入文本的时候可以使用它
一个例子:
$t = $mw->Text()->pack( );
$t->tagConfigure('bold', -font => "Courier 24 bold");
$t->insert('end', "This is some normal text\n");
$t->insert('end', "This is some bold text\n", 'bold');
添加tag
$t->tagAdd('tagName','startPosition1','endPosition1','startPositon2','endPostion2',.....);
如:
$t->tagAdd('bold','sel.first','sel.last') if $t->tagRanges('sel');
sel是内置的特殊tag
sel.first/sel.last表示当前选中文本的开始和结束位置,我们使用tagRanges('sel')来判断是否有被选中的文本。

获得当前选中文本
$sl = $t->get('sel.first','sel.last') if $t->tagRanges('sel');
或者
$sl = $t->getSelected();