单行道

2011年7月31日星期日

Open Perl Modules in Vim

在写程序的时候,用到一些perl模块时,经常需要查看这些模块的源代码。以前用的方法是新开一个screen窗口,module_info Module::Name获得模块的路径,然后再在vim里面打开之

久之感觉这样做颇没效率,于是决定写一个vim的函数来实现":Pme Module::Name"即可打开perl模块的功能。

将以下代码写入 .vimrc即可实现这个功能

function! OpenPerlModule(module) let module_path = system("perldoc -l " . a:module) if v:shell_error == 1 echo module_path return endif execute "e " . module_path endfunction command -nargs=1 Pme call OpenPerlModule()

Posted via email from Tech Blog of Woosley.Xu

2011年7月3日星期日

HTML::FormHandler介绍

  • 使用HTML::FormHandler生成表单

首先尝试创建一个用户登录表单

package Update; use Moose; use HTML::FormHandler::Moose;   #使用has_fields等语法糖 extends {HTML::FormHandler} use namespace::autoclean; use Digest::MD5 qw/md5_hex/;  has '+name' => (default => 'update');  #form的名字 has '+auto_fieldset' => (default => 0); #不在form内添加fieldset #创建表单元素的依赖关系 has '+dependency' => (default => sub{[[qw/password confirm/]]}); has_field 'name' => (type => 'Text', required => 1); has_field 'email' => (type => 'Email', required => 1); #使用apply transform加密密码 has_field 'password' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], ); has_field 'confirm' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], );  sub validate { my ($self) = @_; if ($self->field('confirm')->value ne

$self->field(‘password’)–>value) {

$self->field('password')->add_error("password not match"); } }  package Main; my $form = update->new(); $form->process(params => {name => 'woosley'}); print $form->render;     Name:  Email:  Email field is required Password:  Please enter a password in this

field

Confirm:  Please enter a password in this

field

这里定义了一个用户update的form, 表单名为update,由'+name'一行定义,'+‘在moose里面表示这个属性在父对象里面定义,在子对象中可以进行覆盖操作。form里面包含name,password,email,所有的元素都是必须的

使用这个表单只需要像Main包里面一样,调用$form->process(param => {postparams});即可,$form->render获得HTML代码。可以看到上面代码里面只传入了name,因此会得到一堆错误信息.一般来说如果表单验证提交出错,所有的错误信息都放在$form->errors里面,所以一个表单提交过程应该为

$form = Form->new(); unless($form->process(params => {})){ ##处理 $form->errors } ## 表单提交成功

HTML::FormHandler根据params参数是否为空来确定是否为表单提交,如果params为空,process也会返回失败,从而跳过表单提交后续部分工作。

对于每一个field的验证,可用使用 sub validate_fieldname {} 或者添加在has_field里面添加apply来实现,并定义出错信息

has_field 'email' => ( unique => 1, apply => [ { check => qr/^\w+\.\w+\@gmail\.com$/, message => 'Invalid Email' } ]);

还可以如上添加validate method在最后验证整个表单

如前一篇博文所述,FormHandler使用不同的模块控制如何生成表单HTML,上面例子给出的>是<div&gt形式,我们也可以使用table形式或者在每一个field外面什么都不加

has '+widget_wrapper'   => (default => 'Table'); has '+widget_form' => (default => 'Table');

http://search.cpan.org/~gshank/HTML-FormHandler-0.34001/lib/HTML/FormHandler/... 详细介绍了如何render

to be continued….

Posted via email from Tech Blog of Woosley.Xu

2011年7月2日星期六

HTML::FormHandler介绍

根据Catalyst的胖Model,瘦Controller原则,在controller里面应该使用最少的代码来保持整个逻辑的清爽。 但对于任何一个web app来说,最复杂的逻辑之一就是表单的提交,验证表单,之后再根据需要从做相关 的操作,查询数据库或者返回错误。而这些都是Controller的任务

如果在Controller里面hardcode这部分逻辑,整个代码会变得冗长而丑陋,HTML::FormHandler就是为了简化 表单的处理而编写的模块。HTML::FormHandler使用Moose作为底层的OO库,代码实现比较优雅和干净。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 
package SEA::Forms::User;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
use namespace::autoclean;
use Digest::MD5 qw/md5_hex/;

has '+name' => (default => 'user');
has '+auto_fieldset' => (default => 0);
has '+item_class' => (default => 'User');
has '+dependency' => (default => sub { [[qw/password confirm/]] });
has_field 'id' => (
    type => 'Text',
    required => 1,
    accessor => 'username',
    unique => 1,
    apply => [
        { check => qr/^\w{7}$/,
            message => 'Invalid username'
        }
    ],
    messages => {
        required => 'username is required',
        unique => 'This username is already taken'
    },
);

has_field 'email' => (
    unique => 1,
    messages => {unique => 'This email is already taken'},
    apply => [
        { check => qr/^\w+\.\w+\@ericsson\.com$/,
            message => 'Invalid Email'
        }
    ],
);

has_field 'password' => (
    type => 'Password',
    accessor => 'password',
    apply => [
        { transform => sub { md5_hex(shift) }
        }
    ],
);

has_field 'confirm' => (
    type => 'Password',
    apply => [
        { transform => sub { md5_hex(shift) }
        }
    ],
);

has_field 'submit' => (
    value => 'submit',
    type => 'Submit',
    css_class => 'submit'
);

sub validate {
    my ($self) = @_;
    if ($self->field('confirm')->value ne $self->field('password')->value) {
        $self->field('password')->add_error("password not match");
    }
}

__PACKAGE__->meta->make_immutable;

HTML::FormHandler主要分为这么几个部分

  • HTML::FormHandler::Field::*

Field主要用来定义表单单元的类型,对某一种类型,会有相应的验证方法和属性,比如定义一个Text类型单元

has_field 'name'  => (Type => 'Text', maxlength => 30, minlength =>

6);

  • HTML::FormHandler::Widget::*

Widget用来生成Field的HTML代码,查看源代码,每一个widget都有个render方法,用来创建wdiget的HTML code,这里有两个特殊的widget。HTML::FormHandler::Widget::Wrapper::*,用来添加包裹每个表单单元的HTML,比如添加的是div

<input name="name", type="text">

还有一个是Widget::Form,定义…..部分如何生成

  • HTML::FormHandler:Moose

使用Moose定义的语法糖,比如has_field

HTML::FormHandler::Model::

与数据库交互的模块,值得注意的是FormHandler没有添加任何数据库操作的代码,而只是使用Moose Role定义了数据库操作所需要的方法。

to be continued…

Posted via email from Tech Blog of Woosley.Xu

2011年6月14日星期二

关于诗歌

我是个粗人啊粗人啊,平时喜欢读诗歌而已,
精致简洁的语句对我的吸引力很大,
读着这些语句能让人心情愉悦有莫有...
看多了就有点情不自禁,想自己写点什么,
于是有时偶尔会发发骚
扔上来一些不知所云之后看着自己都觉得幼稚的东西
大部分都是从已有的诗中东抄西凑然后改改拼出来的
比如那个子弹,是看了海子的 亚洲铜 后临摹出的句子
忆东港帮是从 水木 poem版里学来
我是个粗人啊粗人,粗糙的纯爷们,
常挂嘴边的是哥们赤条条来去无牵挂
写在这里是发现自己有文艺青年化的趋势
那不对的...要坚决制止

惶然书

胡桑

我迫不及待地完成。从地平线返回,
背负着夜的寂静,那令人渴望的形式,
学习如何再一次进入生活。白昼永不消失,
就这样存在着,像自己一样盲目。

回到这张活下来的床,回到
食物的体内,一只钟在拒绝时间,
我看见日子裂开。但你和我的
痛楚之间,一场风暴被目光熄灭。

各自的宁静在风暴的中心完成。
我入住恐惧,敲开它的缺席,
丧失之风吹开了另一种呼吸。
那些记忆裸露在一个空洞的下午,

它们在用另一个声音说话,
走向野蛮,用借来的步子。
我逐渐变轻,但一个诺言回到我身上,
只要有一条缝隙,时间就不会自行消失。

不要在现实之外,搜寻一个句子。
语言就住在事物的脸上,它不是
藏于自身的杀手,事物在四周懒散地
走动,那些秘密,无异于桌上的点心和茶水。

“世界比我想象的还要突然。”
带着讯息,它失去了自己的影子,
变得短暂而迟缓,破碎在人群中,
使我更加惶惑。但我看见无数个未来。

Posted via email from Stupid Town

2011年5月15日星期日

perl5.14.0发布 ((tags:perl)

perl5.14.0于UTC时间2011年5月14发布了[1,2,3],perl自5.10发布的时间轴如下:

  • 5.10 2007/12/18
  • 5.11 2009/08/02
  • 5.12 2010/04/12
  • 5.13 2010/05/20
  • 5.14 2011/05/14

扫描了一下perldelta,值得注意的更改有

  • unicode6.0的支持
  • IPv6的支持
  • 新的正则表达式修改符/r,可以保持原来变量不变而返回修改的结果

    $perl -E '$a = "perl", say $a =~ s/p/P/r; say $a' Perl perl
  • 数组和hash容器操作现在支持引用,比如现在可以

    push $hashref, $var;
  • 支持 package {}; 语法

更多参见perldelta文档

http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/msg00621.html

Posted via email from Tech Blog of Woosley.Xu

2011年5月9日星期一

躁动书

阳光徒劳
杨柳的阔叶静寂
时光停滞于树荫以下
面容平寂,目光投向远方

悲伤来袭
啜泣如洪峰泛滥
淹没一条江
断桥之缘
生活静立
停留的依然在身后
远去的早已过眼前

Posted via email from Stupid Town

2011年5月3日星期二

vim-perl@github

如果你使用vim开发perl的话,github上面的vim-perl一定对你有用

https://github.com/petdance/vim-perl

git clone下来make install即可安装上,这个包里面提供了perl,perl6,tt(template toolkit),xs的语法高亮。今天我就是在寻找折行perl模块内建pod的时候找到的这个项目,一些tip如下

"打开perl文件的折行功能 let perl_fold=1 "打开vim的tt文件的filetype au BufNewFile,BufRead *.tt setf tt2

顺便提一下vim插件 http://www.vim.org/scripts/script.php%3Fscript_id%3D556 也是使用vim开发perl的必备工具

Posted via email from Tech Blog of Woosley.Xu