2011年12月9日星期五

[PerlChina] 2011 CN Perl Advent Day 10: Exporter::Auto

http://perlchina.github.com/advent.perlchina.org/2011/Exporter_Auto.html 

=for advent_year 2011

=for advent_day 10

=for advent_title Exporter::Auto

=for advent_author Fayland Lam

M<Exporter::Auto> 是 M<Exporter> 的 enhanced 版本。它默认将您代码里的 subs 导入到 @EXPORT 里,免去了您在 @EXPORT 里人工添加和删除 sub 的烦恼。

该模块今天新鲜出炉,功能方便有某些缺陷,比如您不能控制弄到 @EXPORT_OK (有兴趣的童鞋可以给作者发送 patch, 通过传递 import 参数来配置),比如您不能将 $, @, % 自动或者额外加到 @EXPORT 里,但是该模块还是非常方便的完成了一个既定的任务,将所有的 subs 自动导出。

尤其是代码非常简洁优雅,所以想和诸位共享一下。(中文注释是本人添加)

=begin pre

package Exporter::Auto;
use strict;
use warnings;
use 5.008005;
our $VERSION = '0.01';

use Sub::Identify qw(stash_name);
use B::Hooks::EndOfScope;
use Exporter; # 该行并无必要

sub import {
    my $klass = caller(0); # 得到该调用模块的名字

    no strict 'refs';
    unshift @{"${klass}::ISA"}, 'Exporter'; # 将 Exporter 当成目标模块的父类

    on_scope_end { # 在编译该块代码结束马上运行,因为在 runtime 时会无效
        while (my ($k, $v) = each %{"${klass}::"}) {
            next if $k =~ /^(?:BEGIN|CHECK|END)$/; # 跳过一些 Perl 自带的 sub, 因为都没必要导入。可能需要更多的如 INIT, DESTORY, AUTOLOAD 等。
            next if $k =~ /^_/; # 不导入私有函数
            next unless *{"${klass}::${k}"}{CODE}; # 只导入代码,不导入 scalar, array, hash 等
            next if $klass ne stash_name($klass->can($k)); # 只导入属于调用模块的,而非调用模块所导入的额外sub
            push @{"${klass}::EXPORT"}, $k; # 添加到 @EXPORT
        }
    };
}

1;
__END__

=end pre

非常简洁优雅。use Exporter::Auto; 就等同于 unshift @MYCLASS::ISA, 'Exporter'; @MYCLASS::EXPORT = ('all-my-subs');

每一行都起作用,又能非常完美地完成既定任务。多阅读阅读类似的代码,对 Perl 的学习提升非常有帮助。

PS,阅读模块的代码别忘了阅读模块的 .t 文件。

谢谢。


--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 急问!同样的程序不能say OUT到file但是可以say到screen这是为什么啊

Hi,

    貌似有一个版本要支持这个 "." 语法了.

/Heng

于 2011年12月09日 20:02, 风河 写道:

perl可以重载操作符的吗?
比如->用.代替?

在 2011-12-9 下午6:40,"Michael Zeng" <galaxy2004@gmail.com> 写道:
>
> 对,ms不是perl的数据结构,  perl的带 -> 的,清楚些
>
> 2011/12/9 Shou Ya <zxyzxy12321@gmail.com>
>>
>> �下是C/Java程序�? �不是很有Perl程序��有的那��格啊.
>>
>> 在 2011年11月28日 上午9:53,mandova <mandova1005@yahoo.cn> 写道:
>> > z这样呀~
>> >
>> > #!usr/bin/perl -w
>> > use 5.010;
>> >
>> >
>> > $a[0][1]=0.1;  $a[0][2]=0.2;  $a[0][3]=0.6;  $a[0][4]=0.1; # 4
>> > starting probs
>> > $a[1][0]=0.1;  $a[2][0]=0.2;  $a[3][0]=0.6;  $a[4][0]=0.1; # 4 ending
>> > probs
>> > $a[1][1]=0.1;  $a[1][2]=0.7;  $a[1][3]=0.1;  $a[1][4]=0.1;
>> > $a[2][1]=0.1;  $a[2][2]=0.75;  $a[2][3]=0.1;  $a[2][4]=0.05;
>> > $a[3][1]=0.3;  $a[3][2]=0.2;  $a[3][3]=0.4;  $a[3][4]=0.1;
>> > $a[4][1]=0.2;  $a[4][2]=0.2;  $a[4][3]=0.4;  $a[4][4]=0.2;
>> >
>> > @lamda=(0,1,8,4,30);
>> >
>> > sub Poi # $_[0] is lambda, $_[1] is x.
>> > {
>> >   $aa=exp(-$_[0])*$_[0]**$_[1];
>> >   if($_[1]>1)
>> >   {
>> >      foreach $frac(1..$_[1]) { $aa=$aa/$frac; }
>> >   }
>> >   $aa;
>> > }
>> >
>> >  if(!open OUT, ">", "nor_debug") { die "can't open processing middle
>> > file for nor!"; }
>> >
>> > $delta=1;
>> > $itr=1;
>> > while(($delta>0.00001)&&($itr<100000))
>> > {
>> >   say OUT "begin itr: $itr";
>> >   foreach $ch(1..22)
>> >   {
>> >      if(!open IN, "<", "nor$ch.fs") { die "can't open full sites for
>> > chromosome $ch!"; }
>> >
>> >
>> >      @x=(0);
>> >      $L=0;
>> >      while(<IN>)
>> >      {
>> >         chomp;
>> >         if(/\d+\t(\d+)/) { push(@x,$1); $L++;}
>> >      }
>> >      close IN;
>> >      @s=();
>> >      @f=();
>> >      $f[0][0]=1; $f[1][0]=0; $f[2][0]=0; $f[3][0]=0; $f[4][0]=0;
>> >      $s[0]=1;
>> >      foreach $m(1..4)
>> >      {
>> >         $f[$m][1] += &Poi($lamda[$m],$x[1]) * $a[0][$m];
>> >         $s[1] += $f[$m][1];
>> >      }
>> >      foreach $m(1..4)
>> >      {
>> >         $f[$m][1]/=$s[1];
>> >      }
>> >
>> >      foreach $i(2..$L)
>> >      {
>> >         $im=$i-1;
>> >         foreach $k(1..4)
>> >         {
>> >            foreach $q(1..4)
>> >            {
>> >               $f[$k][$i] += $f[$q][$im] * $a[$q][$k];
>> >            }
>> >            $f[$k][$i] *= &Poi($lamda[$k],$x[$i]);
>> >            $s[$i] += $f[$k][$i];
>> >         }
>> >         foreach $k(1..4)
>> >         {
>> >            $f[$k][$i]/=$s[$i];
>> >         }
>> >      }
>> >
>> >      foreach $k(1..4)  # calcu P(X)!
>> >      {
>> >         $px+=$f[$k][$L]*$a[$k][0];
>> >      }
>> >      say OUT "finished XX for chromosome $ch!";
>> > ......
>> >
>> > 呐,就两个say之间,砍到while后面没有,while里面什么也不做的时候就可以say OUT了。。。
>> > ps那个f[$k]是一个有150w个以上的分量的数组,我算到100万多一点的时候就变成-NaN了。。。。。。这又是另一个问题了。。。。。
>> >
>> > On 11月27日, 下午9时31分, cnhack TNT <cnhack...@gmail.com> wrote:
>> >> 额。。。麻烦多贴些相关代码成么? 不然要大家瞎子摸黑怎么个帮法儿?
>> >> 你都说了,砍掉一些语句就有输出了,那不就是你砍掉的语句有问题么,贴上来分析分析不就清楚了?
>> >>
>> >> 2011/11/27 mandova <mandova1...@yahoo.cn>
>> >>
>> >>
>> >>
>> >> > if(!open OUT,">","<文件名>" ) { die "..."; }
>> >> > 一直都是这样写的页没有出问题。。。程序一开始运行就应该有一个输出的,但是say OUT没有,如果只是say就有在屏幕上。我把两个应该有输出的地
>> >> > 方之间的语句砍到一定程度就可以say OUT了。。。
>> >>
>> >> > On 11月27日, 下午8时31分, 昨夜星尘 <chun191...@gmail.com> wrote:
>> >> > > 你的OUT是怎么定义的?定义错误也会出现这种情况。写文件用不了多少内存。
>> >>
>> >> > > On 11月27日, 下午4时28分, mandova <mandova1...@yahoo.cn> wrote:
>> >>
>> >> > > > 我一直是这样写的,没有用过STDOUT,不知为什么这个程序就不行了。我试着把两个输出之间的语句减少看是否能够输出,答案是可以的(但是是没有任何
>> >> > > > 道理啊。。)
>> >> > > > 中间语句多到一定程度就不能写到文件里(文件始终为空),而我把OUT去掉就一直会持续地在屏幕上有输出。
>> >> > > > 我现在觉得是内存的问题。。。因为中间处理的数据很大。不了解写文件的动作要占用多少内存,似乎是压死骆驼的那最后一根稻草。。
>> >>
>> >> > > > On 11月27日, 下午3时26分, Robin Lee <robinlee.s...@gmail.com> wrote:
>> >>
>> >> > > > > 应该改成 STDOUT ?
>> >>
>> >> > > > > 2011/11/27 mandova <mandova1...@yahoo.cn>
>> >>
>> >> > > > > > 改成print也不行,文件打开没有报错,就是死活写不进文件啊~~~把OUT去掉就可以写在屏幕上。。。。- 隐藏被引用文字 -
>> >>
>> >> > > > > - 显示引用的文字 -- 隐藏被引用文字 -
>> >>
>> >> > > - 显示引用的文字 -
>> >>
>> >> > --
>> >> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> >> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> >> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> >> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访 问此网上论坛。- 隐藏被引用文字 -
>> >>
>> >> - 显示引用的文字 -
>> >
>> >
>>
>>
>>
>> --
>> Ya Shou
>> zxyzxy12321@gmail.com
>> http://54c3.tk
>>
>>
>
>
>
> --
>             Yours Sincerely
>                     Zeng Hong
>



--  我的博客 -- http://blog.yixinit.com/ 诸法从缘起,如来说是因。 彼法因缘尽,是大沙门说。 

Re: [PerlChina] Re: 急问!同样的程序不能say OUT到file但是可以say到screen这是为什么啊

perl可以重载操作符的吗?
比如->用.代替?

在 2011-12-9 下午6:40,"Michael Zeng" <galaxy2004@gmail.com>写道:
>
> 对,ms不是perl的数据结构,  perl的带 -> 的,清楚些
>
> 2011/12/9 Shou Ya <zxyzxy12321@gmail.com>
>>
>> �下是C/Java程序�? �不是很有Perl程序��有的那��格啊.
>>
>> 在 2011年11月28日 上午9:53,mandova <mandova1005@yahoo.cn> 写道:
>> > z这样呀~
>> >
>> > #!usr/bin/perl -w
>> > use 5.010;
>> >
>> >
>> > $a[0][1]=0.1;  $a[0][2]=0.2;  $a[0][3]=0.6;  $a[0][4]=0.1; # 4
>> > starting probs
>> > $a[1][0]=0.1;  $a[2][0]=0.2;  $a[3][0]=0.6;  $a[4][0]=0.1; # 4 ending
>> > probs
>> > $a[1][1]=0.1;  $a[1][2]=0.7;  $a[1][3]=0.1;  $a[1][4]=0.1;
>> > $a[2][1]=0.1;  $a[2][2]=0.75;  $a[2][3]=0.1;  $a[2][4]=0.05;
>> > $a[3][1]=0.3;  $a[3][2]=0.2;  $a[3][3]=0.4;  $a[3][4]=0.1;
>> > $a[4][1]=0.2;  $a[4][2]=0.2;  $a[4][3]=0.4;  $a[4][4]=0.2;
>> >
>> > @lamda=(0,1,8,4,30);
>> >
>> > sub Poi # $_[0] is lambda, $_[1] is x.
>> > {
>> >   $aa=exp(-$_[0])*$_[0]**$_[1];
>> >   if($_[1]>1)
>> >   {
>> >      foreach $frac(1..$_[1]) { $aa=$aa/$frac; }
>> >   }
>> >   $aa;
>> > }
>> >
>> >  if(!open OUT, ">", "nor_debug") { die "can't open processing middle
>> > file for nor!"; }
>> >
>> > $delta=1;
>> > $itr=1;
>> > while(($delta>0.00001)&&($itr<100000))
>> > {
>> >   say OUT "begin itr: $itr";
>> >   foreach $ch(1..22)
>> >   {
>> >      if(!open IN, "<", "nor$ch.fs") { die "can't open full sites for
>> > chromosome $ch!"; }
>> >
>> >
>> >      @x=(0);
>> >      $L=0;
>> >      while(<IN>)
>> >      {
>> >         chomp;
>> >         if(/\d+\t(\d+)/) { push(@x,$1); $L++;}
>> >      }
>> >      close IN;
>> >      @s=();
>> >      @f=();
>> >      $f[0][0]=1; $f[1][0]=0; $f[2][0]=0; $f[3][0]=0; $f[4][0]=0;
>> >      $s[0]=1;
>> >      foreach $m(1..4)
>> >      {
>> >         $f[$m][1] += &Poi($lamda[$m],$x[1]) * $a[0][$m];
>> >         $s[1] += $f[$m][1];
>> >      }
>> >      foreach $m(1..4)
>> >      {
>> >         $f[$m][1]/=$s[1];
>> >      }
>> >
>> >      foreach $i(2..$L)
>> >      {
>> >         $im=$i-1;
>> >         foreach $k(1..4)
>> >         {
>> >            foreach $q(1..4)
>> >            {
>> >               $f[$k][$i] += $f[$q][$im] * $a[$q][$k];
>> >            }
>> >            $f[$k][$i] *= &Poi($lamda[$k],$x[$i]);
>> >            $s[$i] += $f[$k][$i];
>> >         }
>> >         foreach $k(1..4)
>> >         {
>> >            $f[$k][$i]/=$s[$i];
>> >         }
>> >      }
>> >
>> >      foreach $k(1..4)  # calcu P(X)!
>> >      {
>> >         $px+=$f[$k][$L]*$a[$k][0];
>> >      }
>> >      say OUT "finished XX for chromosome $ch!";
>> > ......
>> >
>> > 呐,就两个say之间,砍到while后面没有,while里面什么也不做的时候就可以say OUT了。。。
>> > ps那个f[$k]是一个有150w个以上的分量的数组,我算到100万多一点的时候就变成-NaN了。。。。。。这又是另一个问题了。。。。。
>> >
>> > On 11月27日, 下午9时31分, cnhack TNT <cnhack...@gmail.com> wrote:
>> >> 额。。。麻烦多贴些相关代码成么? 不然要大家瞎子摸黑怎么个帮法儿?
>> >> 你都说了,砍掉一些语句就有输出了,那不就是你砍掉的语句有问题么,贴上来分析分析不就清楚了?
>> >>
>> >> 2011/11/27 mandova <mandova1...@yahoo.cn>
>> >>
>> >>
>> >>
>> >> > if(!open OUT,">","<文件名>" ) { die "..."; }
>> >> > 一直都是这样写的页没有出问题。。。程序一开始运行就应该有一个输出的,但是say OUT没有,如果只是say就有在屏幕上。我把两个应该有输出的地
>> >> > 方之间的语句砍到一定程度就可以say OUT了。。。
>> >>
>> >> > On 11月27日, 下午8时31分, 昨夜星尘 <chun191...@gmail.com> wrote:
>> >> > > 你的OUT是怎么定义的?定义错误也会出现这种情况。写文件用不了多少内存。
>> >>
>> >> > > On 11月27日, 下午4时28分, mandova <mandova1...@yahoo.cn> wrote:
>> >>
>> >> > > > 我一直是这样写的,没有用过STDOUT,不知为什么这个程序就不行了。我试着把两个输出之间的语句减少看是否能够输出,答案是可以的(但是是没有任何
>> >> > > > 道理啊。。)
>> >> > > > 中间语句多到一定程度就不能写到文件里(文件始终为空),而我把OUT去掉就一直会持续地在屏幕上有输出。
>> >> > > > 我现在觉得是内存的问题。。。因为中间处理的数据很大。不了解写文件的动作要占用多少内存,似乎是压死骆驼的那最后一根稻草。。
>> >>
>> >> > > > On 11月27日, 下午3时26分, Robin Lee <robinlee.s...@gmail.com> wrote:
>> >>
>> >> > > > > 应该改成 STDOUT ?
>> >>
>> >> > > > > 2011/11/27 mandova <mandova1...@yahoo.cn>
>> >>
>> >> > > > > > 改成print也不行,文件打开没有报错,就是死活写不进文件啊~~~把OUT去掉就可以写在屏幕上。。。。- 隐藏被引用文字 -
>> >>
>> >> > > > > - 显示引用的文字 -- 隐藏被引用文字 -
>> >>
>> >> > > - 显示引用的文字 -
>> >>
>> >> > --
>> >> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> >> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> >> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> >> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。- 隐藏被引用文字 -
>> >>
>> >> - 显示引用的文字 -
>> >
>> > --
>> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>> >
>>
>>
>>
>> --
>> Ya Shou
>> zxyzxy12321@gmail.com
>> http://54c3.tk
>>
>> --
>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>
>
>
>
> --
>             Yours Sincerely
>                     Zeng Hong
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 急问!同样的程序不能say OUT到file但是可以say到screen这是为什么啊

对,ms不是perl的数据结构,  perl的带 -> 的,清楚些

2011/12/9 Shou Ya <zxyzxy12321@gmail.com>
�下是C/Java程序�? �不是很有Perl程序��有的那��格啊.

在 2011年11月28日 上午9:53,mandova <mandova1005@yahoo.cn> 写道:
> z这样呀~
>
> #!usr/bin/perl -w
> use 5.010;
>
>
> $a[0][1]=0.1;  $a[0][2]=0.2;  $a[0][3]=0.6;  $a[0][4]=0.1; # 4
> starting probs
> $a[1][0]=0.1;  $a[2][0]=0.2;  $a[3][0]=0.6;  $a[4][0]=0.1; # 4 ending
> probs
> $a[1][1]=0.1;  $a[1][2]=0.7;  $a[1][3]=0.1;  $a[1][4]=0.1;
> $a[2][1]=0.1;  $a[2][2]=0.75;  $a[2][3]=0.1;  $a[2][4]=0.05;
> $a[3][1]=0.3;  $a[3][2]=0.2;  $a[3][3]=0.4;  $a[3][4]=0.1;
> $a[4][1]=0.2;  $a[4][2]=0.2;  $a[4][3]=0.4;  $a[4][4]=0.2;
>
> @lamda=(0,1,8,4,30);
>
> sub Poi # $_[0] is lambda, $_[1] is x.
> {
>   $aa=exp(-$_[0])*$_[0]**$_[1];
>   if($_[1]>1)
>   {
>      foreach $frac(1..$_[1]) { $aa=$aa/$frac; }
>   }
>   $aa;
> }
>
>  if(!open OUT, ">", "nor_debug") { die "can't open processing middle
> file for nor!"; }
>
> $delta=1;
> $itr=1;
> while(($delta>0.00001)&&($itr<100000))
> {
>   say OUT "begin itr: $itr";
>   foreach $ch(1..22)
>   {
>      if(!open IN, "<", "nor$ch.fs") { die "can't open full sites for
> chromosome $ch!"; }
>
>
>      @x=(0);
>      $L=0;
>      while(<IN>)
>      {
>         chomp;
>         if(/\d+\t(\d+)/) { push(@x,$1); $L++;}
>      }
>      close IN;
>      @s=();
>      @f=();
>      $f[0][0]=1; $f[1][0]=0; $f[2][0]=0; $f[3][0]=0; $f[4][0]=0;
>      $s[0]=1;
>      foreach $m(1..4)
>      {
>         $f[$m][1] += &Poi($lamda[$m],$x[1]) * $a[0][$m];
>         $s[1] += $f[$m][1];
>      }
>      foreach $m(1..4)
>      {
>         $f[$m][1]/=$s[1];
>      }
>
>      foreach $i(2..$L)
>      {
>         $im=$i-1;
>         foreach $k(1..4)
>         {
>            foreach $q(1..4)
>            {
>               $f[$k][$i] += $f[$q][$im] * $a[$q][$k];
>            }
>            $f[$k][$i] *= &Poi($lamda[$k],$x[$i]);
>            $s[$i] += $f[$k][$i];
>         }
>         foreach $k(1..4)
>         {
>            $f[$k][$i]/=$s[$i];
>         }
>      }
>
>      foreach $k(1..4)  # calcu P(X)!
>      {
>         $px+=$f[$k][$L]*$a[$k][0];
>      }
>      say OUT "finished XX for chromosome $ch!";
> ......
>
> 呐,就两个say之间,砍到while后面没有,while里面什么也不做的时候就可以say OUT了。。。
> ps那个f[$k]是一个有150w个以上的分量的数组,我算到100万多一点的时候就变成-NaN了。。。。。。这又是另一个问题了。。。。。
>
> On 11月27日, 下午9时31分, cnhack TNT <cnhack...@gmail.com> wrote:
>> 额。。。麻烦多贴些相关代码成么? 不然要大家瞎子摸黑怎么个帮法儿?
>> 你都说了,砍掉一些语句就有输出了,那不就是你砍掉的语句有问题么,贴上来分析分析不就清楚了?
>>
>> 2011/11/27 mandova <mandova1...@yahoo.cn>
>>
>>
>>
>> > if(!open OUT,">","<文件名>" ) { die "..."; }
>> > 一直都是这样写的页没有出问题。。。程序一开始运行就应该有一个输出的,但是say OUT没有,如果只是say就有在屏幕上。我把两个应该有输出的地
>> > 方之间的语句砍到一定程度就可以say OUT了。。。
>>
>> > On 11月27日, 下午8时31分, 昨夜星尘 <chun191...@gmail.com> wrote:
>> > > 你的OUT是怎么定义的?定义错误也会出现这种情况。写文件用不了多少内存。
>>
>> > > On 11月27日, 下午4时28分, mandova <mandova1...@yahoo.cn> wrote:
>>
>> > > > 我一直是这样写的,没有用过STDOUT,不知为什么这个程序就不行了。我试着把两个输出之间的语句减少看是否能够输出,答案是可以的(但是是没有任何
>> > > > 道理啊。。)
>> > > > 中间语句多到一定程度就不能写到文件里(文件始终为空),而我把OUT去掉就一直会持续地在屏幕上有输出。
>> > > > 我现在觉得是内存的问题。。。因为中间处理的数据很大。不了解写文件的动作要占用多少内存,似乎是压死骆驼的那最后一根稻草。。
>>
>> > > > On 11月27日, 下午3时26分, Robin Lee <robinlee.s...@gmail.com> wrote:
>>
>> > > > > 应该改成 STDOUT ?
>>
>> > > > > 2011/11/27 mandova <mandova1...@yahoo.cn>
>>
>> > > > > > 改成print也不行,文件打开没有报错,就是死活写不进文件啊~~~把OUT去掉就可以写在屏幕上。。。。- 隐藏被引用文字 -
>>
>> > > > > - 显示引用的文字 -- 隐藏被引用文字 -
>>
>> > > - 显示引用的文字 -
>>
>> > --
>> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。- 隐藏被引用文字 -
>>
>> - 显示引用的文字 -
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>



--
Ya Shou
zxyzxy12321@gmail.com
http://54c3.tk

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。




--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 急问!同样的程序不能say OUT到file但是可以say到screen这是为什么啊

�下是C/Java程序�? �不是很有Perl程序��有的那��格啊.

在 2011年11月28日 上午9:53,mandova <mandova1005@yahoo.cn> 写道:
> z这样呀~
>
> #!usr/bin/perl -w
> use 5.010;
>
>
> $a[0][1]=0.1; $a[0][2]=0.2; $a[0][3]=0.6; $a[0][4]=0.1; # 4
> starting probs
> $a[1][0]=0.1; $a[2][0]=0.2; $a[3][0]=0.6; $a[4][0]=0.1; # 4 ending
> probs
> $a[1][1]=0.1; $a[1][2]=0.7; $a[1][3]=0.1; $a[1][4]=0.1;
> $a[2][1]=0.1; $a[2][2]=0.75; $a[2][3]=0.1; $a[2][4]=0.05;
> $a[3][1]=0.3; $a[3][2]=0.2; $a[3][3]=0.4; $a[3][4]=0.1;
> $a[4][1]=0.2; $a[4][2]=0.2; $a[4][3]=0.4; $a[4][4]=0.2;
>
> @lamda=(0,1,8,4,30);
>
> sub Poi # $_[0] is lambda, $_[1] is x.
> {
> $aa=exp(-$_[0])*$_[0]**$_[1];
> if($_[1]>1)
> {
> foreach $frac(1..$_[1]) { $aa=$aa/$frac; }
> }
> $aa;
> }
>
> if(!open OUT, ">", "nor_debug") { die "can't open processing middle
> file for nor!"; }
>
> $delta=1;
> $itr=1;
> while(($delta>0.00001)&&($itr<100000))
> {
> say OUT "begin itr: $itr";
> foreach $ch(1..22)
> {
> if(!open IN, "<", "nor$ch.fs") { die "can't open full sites for
> chromosome $ch!"; }
>
>
> @x=(0);
> $L=0;
> while(<IN>)
> {
> chomp;
> if(/\d+\t(\d+)/) { push(@x,$1); $L++;}
> }
> close IN;
> @s=();
> @f=();
> $f[0][0]=1; $f[1][0]=0; $f[2][0]=0; $f[3][0]=0; $f[4][0]=0;
> $s[0]=1;
> foreach $m(1..4)
> {
> $f[$m][1] += &Poi($lamda[$m],$x[1]) * $a[0][$m];
> $s[1] += $f[$m][1];
> }
> foreach $m(1..4)
> {
> $f[$m][1]/=$s[1];
> }
>
> foreach $i(2..$L)
> {
> $im=$i-1;
> foreach $k(1..4)
> {
> foreach $q(1..4)
> {
> $f[$k][$i] += $f[$q][$im] * $a[$q][$k];
> }
> $f[$k][$i] *= &Poi($lamda[$k],$x[$i]);
> $s[$i] += $f[$k][$i];
> }
> foreach $k(1..4)
> {
> $f[$k][$i]/=$s[$i];
> }
> }
>
> foreach $k(1..4) # calcu P(X)!
> {
> $px+=$f[$k][$L]*$a[$k][0];
> }
> say OUT "finished XX for chromosome $ch!";
> ......
>
> 呐,就两个say之间,砍到while后面没有,while里面什么也不做的时候就可以say OUT了。。。
> ps那个f[$k]是一个有150w个以上的分量的数组,我算到100万多一点的时候就变成-NaN了。。。。。。这又是另一个问题了。。。。。
>
> On 11月27日, 下午9时31分, cnhack TNT <cnhack...@gmail.com> wrote:
>> 额。。。麻烦多贴些相关代码成么? 不然要大家瞎子摸黑怎么个帮法儿?
>> 你都说了,砍掉一些语句就有输出了,那不就是你砍掉的语句有问题么,贴上来分析分析不就清楚了?
>>
>> 2011/11/27 mandova <mandova1...@yahoo.cn>
>>
>>
>>
>> > if(!open OUT,">","<文件名>" ) { die "..."; }
>> > 一直都是这样写的页没有出问题。。。程序一开始运行就应该有一个输出的,但是say OUT没有,如果只是say就有在屏幕上。我把两个应该有输出的地
>> > 方之间的语句砍到一定程度就可以say OUT了。。。
>>
>> > On 11月27日, 下午8时31分, 昨夜星尘 <chun191...@gmail.com> wrote:
>> > > 你的OUT是怎么定义的?定义错误也会出现这种情况。写文件用不了多少内存。
>>
>> > > On 11月27日, 下午4时28分, mandova <mandova1...@yahoo.cn> wrote:
>>
>> > > > 我一直是这样写的,没有用过STDOUT,不知为什么这个程序就不行了。我试着把两个输出之间的语句减少看是否能够输出,答案是可以的(但是是没有任何
>> > > > 道理啊。。)
>> > > > 中间语句多到一定程度就不能写到文件里(文件始终为空),而我把OUT去掉就一直会持续地在屏幕上有输出。
>> > > > 我现在觉得是内存的问题。。。因为中间处理的数据很大。不了解写文件的动作要占用多少内存,似乎是压死骆驼的那最后一根稻草。。
>>
>> > > > On 11月27日, 下午3时26分, Robin Lee <robinlee.s...@gmail.com> wrote:
>>
>> > > > > 应该改成 STDOUT ?
>>
>> > > > > 2011/11/27 mandova <mandova1...@yahoo.cn>
>>
>> > > > > > 改成print也不行,文件打开没有报错,就是死活写不进文件啊~~~把OUT去掉就可以写在屏幕上。。。。- 隐藏被引用文字 -
>>
>> > > > > - 显示引用的文字 -- 隐藏被引用文字 -
>>
>> > > - 显示引用的文字 -
>>
>> > --
>> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。- 隐藏被引用文字 -
>>
>> - 显示引用的文字 -
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>

--
Ya Shou
zxyzxy12321@gmail.com
http://54c3.tk

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月8日星期四

[PerlChina] 如何通过perl快捷的判断服务器时间是否同步

大家好

我现在有这么一个问题,想通过perl脚本来实现检查linux服务器的时钟是否与ntp服务器同步,如果同步了,需要判断是否正常?


--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 答复: Perl 的键盘编程

用win32::GUITest就可以实现,原来就是这么简单.
那窗口的信息怎么获取呢?
然后指定打开那个窗口~



-- Sent from my HP Veer


jiemaoshangdewu@gmail.com<jiemaoshangdewu@gmail.com>于2011-12-8 20:23写道:

怎么样才能实现在windows里,运行一个脚本,就相当于按下键盘上的一个键,如"F1".
要用API吗
还是POE呢

-- Sent from my HP Veer



--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 2011 CN Perl Advent Day 8: Template::Mustache

http://perlchina.github.com/advent.perlchina.org/2011/TemplateMustache.html 

=for advent_year 2011

=for advent_day 8

=for advent_title Template::Mustache

=for advent_author Beckheng Lam

M<Template::Mustache>是一个模板模块,它是mustache (http://mustache.github.com/) 的Perl实现版本. 
mustache的语法相当简洁, 有多个编程语言 (.NET, JavaScript, PHP, Python, Ruby, Java等)的实现. 因而能在多个语言中共享一个模板内容, 传入相应的数据即可. 不可过分依赖这种情形.
当然Template::Mustache的安装也较容易. 但要求Perl 5.8或之后的版本.

安装模块, 有时我会用cpanp (M<CPANPLUS>), 有时会用cpanm (M<App::cpanminus>), 这次使用前者:
cpanp -i Template::Mustache

详细请参阅CPAN: M<Template::Mustache>, 下面是小例子:

=begin code

use strict;

use Template::Mustache;

my $tmpl = Template::Mustache->new();

my $strTemplateContent = "Hello {{name}}!\n";

print $tmpl->render($strTemplateContent, { 'name' => 'Beckheng' });
#output:
#Hello Beckheng!

my $strTemplateContent2 = "Person:\n{{#person}}  {{name}}, {{age}}\n{{/person}}\n";
print $tmpl->render($strTemplateContent2, { 'person' => [
{ 'name' => 'Beckheng', 'age' => 33 },
{ 'name' => 'BB', 'age' => 2 },
] });
#output:
#Person:
#  Beckheng, 33
#  BB, 2

=end code

第一次参与, 谢谢!

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Perl 的键盘编程

I guess you need   Win32::GuiTest   http://search.cpan.org/dist/Win32-GuiTest/

Regards
Thinkhy

在 2011年12月8日 下午8:22, <jiemaoshangdewu@gmail.com>写道:
怎么样才能实现在windows里,运行一个脚本,就相当于按下键盘上的一个键,如"F1".
要用API吗
还是POE呢

-- Sent from my HP Veer



--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] Perl 的键盘编程

怎么样才能实现在windows里,运行一个脚本,就相当于按下键盘上的一个键,如"F1".
要用API吗
还是POE呢

-- Sent from my HP Veer



--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月7日星期三

Re: [PerlChina] 2011 CN Perl Advent Day 7: Imager::QRCode

很不错呀

2011/12/7 Fayland Lam <fayland@gmail.com>:
> http://perlchina.github.com/advent.perlchina.org/2011/Imager_QRCode.html
>
> =for advent_year 2011
>
> =for advent_day 7
>
> =for advent_title Imager::QRCode
>
> =for advent_author CGI.NET
>
> M<Imager::QRCode> 有趣的二位码生成模块。
>
> 随着电子商务的兴起,二维码这种东西越来越多的出现在我们的生活中,想不想给你的用户也拥有一份属于自己网站的二维码呢?那用Imager::QRCode就没错了。
>
> Imager::QRCode是一套基于开源二维码生成库libqrencode的模块,这两个的作者都是日本人。
>
> Imager::QRCode自带了libqrencode的源码,并且在安装的时候会自动编译,所以你不用去专门下载libqrencode而只需要使用CPAN正常安装即可。
>
> 需要说明的是Imager::QRCode依赖Imager模块,并且生成的图片格式也是依赖Imager模块能产生的格式。所以如果你希望生成GIF格式的文件却发现没有任何效果不妨先检查下你所装的Imagerm模块是否能正常生成GIF格式的文件。
>
>
> Imager::QRCode使用的方法非常简单:
>
> =begin code
>
> #!/usr/bin/perl -w
> use Imager::QRCode;
> my $qrcode = Imager::QRCode->new(
> size => 2,
> margin => 2,
> version => 1,
> level => 'M',
> casesensitive => 1,
> lightcolor => Imager::Color->new(255, 255, 255),
> darkcolor => Imager::Color->new(0, 0, 0),
> );
> my $img = $qrcode->plot("You infomation here!");
> $img->write(file => 'qrcode.gif', type=>'gif') or die $img->errstr;
>
> =end code
>
> 有关Libqrencode的信息可以访问 L<http://fukuchi.org/works/qrencode/index.html.en>
> 更多的使用方法请参阅 perldoc M<Imager::QRCode>。
>
> 谢谢。
>
>
> --
> Fayland Lam // http://www.fayland.org/
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 2011 CN Perl Advent Day 7: Imager::QRCode


=for advent_year 2011

=for advent_day 7

=for advent_title Imager::QRCode

=for advent_author CGI.NET

M<Imager::QRCode> 有趣的二位码生成模块。

随着电子商务的兴起,二维码这种东西越来越多的出现在我们的生活中,想不想给你的用户也拥有一份属于自己网站的二维码呢?那用Imager::QRCode就没错了。

Imager::QRCode是一套基于开源二维码生成库libqrencode的模块,这两个的作者都是日本人。

Imager::QRCode自带了libqrencode的源码,并且在安装的时候会自动编译,所以你不用去专门下载libqrencode而只需要使用CPAN正常安装即可。

需要说明的是Imager::QRCode依赖Imager模块,并且生成的图片格式也是依赖Imager模块能产生的格式。所以如果你希望生成GIF格式的文件却发现没有任何效果不妨先检查下你所装的Imagerm模块是否能正常生成GIF格式的文件。


Imager::QRCode使用的方法非常简单:

=begin code

#!/usr/bin/perl -w
use Imager::QRCode;
my $qrcode = Imager::QRCode->new(
        size          => 2,
        margin        => 2,
        version       => 1,
        level         => 'M',
        casesensitive => 1,
        lightcolor    => Imager::Color->new(255, 255, 255),
        darkcolor     => Imager::Color->new(0, 0, 0),
    );
    my $img = $qrcode->plot("You infomation here!");
       $img->write(file => 'qrcode.gif', type=>'gif')  or die  $img->errstr;
     
=end code

有关Libqrencode的信息可以访问 L<http://fukuchi.org/works/qrencode/index.html.en>
更多的使用方法请参阅 perldoc M<Imager::QRCode>。

谢谢。


--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月6日星期二

[PerlChina] 2011 CN Perl Advent Day 6: BerkeleyDB

http://perlchina.github.com/advent.perlchina.org/2011/BerkeleyDB.html 

=for advent_year 2011

=for advent_day 6

=for advent_title BerkeleyDB

=for advent_author Fayland Lam

M<BerkeleyDB> 是个高性能的数据库。

当您需要操作一个极其巨大的文件,需要构造一个 super big 的 hash 或者 array 的时候,内存可能就是您最大的烦恼所在。而 BerkeleyDB 可以通过硬盘空间来保存该 hash 或者 array,到时候可以快速定位和 sort 之类,来完成您的需求。

BerkeleyDB 的详细介绍和设计可以参阅 A<http://www.aosabook.org/en/bdb.html|The Architecture of Open Source Applications> 的章节。

在 Ubuntu 之类的系统下可以通过 $ sudo apt-get install libberkeleydb-perl 来安装,FreeBSD 可以到 /usr/ports/databases/p5-BerkeleyDB 来 make install, Win32 下不支持,其它的可以 Google 得到安装指南。

在单线程的情况下,一个简单的例子如下:

=begin code

use FindBin qw/$Bin/;
use BerkeleyDB;

my $berkeleydb_temp_file = "$Bin/tmp.berkeleydb"; # temp file for BerkeleyDB
tie my %data, 'BerkeleyDB::Hash',
    -Filename => $berkeleydb_temp_file,
    -Flags    => DB_CREATE|DB_TRUNCATE
        or die "Cannot create file: $! $BerkeleyDB::Error\n";
open(my $fh, '<', 'RealBigFile.log') or die "Can't open: $!";
while (my $line = <$fh>) {
    ## some code that %data will be a real very big hash
    ## we just need the first line and the last line which matches the $pattern
    my $pattern = get_pattern($line);
    if (exists $data{"start_$pattern"}) {
        $data{"end_$pattern"} = $line;
    } else {
        $data{"start_$pattern"} = $line;
    }
}
close($fh);
# now working on the %data

=end code

你可以不停的 ls -ls 来查看 tmp.berkeleydb 的大小,顺便 monitor 下内存。

BerkeleyDB 对多线程的支持也很不错,支持数千并发线程,最大 256TB 数据。在多线程的情况下,需要使用 BerkeleyDB::Env cds_lock 保证数据安全。简单的例子如下:

=begin code

my $env = new BerkeleyDB::Env
    -Home   => $tmp_dir,
    -Flags  => DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL
        or die "cannot open environment: $BerkeleyDB::Error\n";
my $db = tie my %data, 'BerkeleyDB::Hash',
    -Filename => $berkeleydb_temp_file,
    -Flags    => DB_CREATE,
    -Env      => $env
        or die "Cannot create file: $! $BerkeleyDB::Error\n";

my $pm = new Parallel::ForkManager(4);
foreach my $i (1 .. 1000) {
    $pm->start and next; # do the fork
    
    my $lock = $db->cds_lock();
    $data{$i} = $i * 2;
    $db->db_sync();
    $lock->cds_unlock();
    
    $pm->finish; # Terminates the child process
}

$pm->wait_all_children;

=end code

更多的使用方法请参阅 perldoc M<BerkeleyDB>。

谢谢。


--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月5日星期一

[PerlChina] 2011 CN Perl Advent Day 5: Data::MessagePack

http://perlchina.github.com/advent.perlchina.org/2011/MessagePack.html 

=for advent_year 2011

=for advent_day 5

=for advent_title Data::MessagePack

=for advent_author Fayland Lam

很多时候我们经常会碰到,要将某个对象或者变量保存起来,然后在另外的时间或者地点重新使用它。这种用途非常广泛,但是您可能没有发现。比如当您用 Cache 模块的时候,我们都需要将要保存的东西先转化成 binary 或者文本格式,然后再保存到缓存里。

在计算机世界,这种做法叫做 B<serialize>。

Perl 里最常见的是 M<Storable>。Storable 很古老但却最常用。它的缺点之一是不垮语言的。你无法用其他语言来 deserialize 出保存的东西。但是它很强大,可以 serialize 复杂的模块实例。

另外常用的有 M<JSON> 甚至 M<YAML>。JSON 更流行一些。它们的优点在于不 deserialize 也可以直接看到内容。

而今天我们要介绍的是 M<Data::MessagePack>。它相对 JSON 的优点在于小(节省内存)而且快速。它也是跨语言的,大部分流行的语言支持都可以在 A<http://msgpack.org/> 里找到。

它的 RPC 实现是 M<AnyEvent::MPRPC>。

使用例子摘抄 perldoc:

=begin code

use Data::MessagePack;

my $mp = Data::MessagePack->new();
$mp->canonical->utf8->prefer_integer if $needed;

my $packed   = $mp->pack($dat);
my $unpacked = $mp->unpack($dat);

=end code

更多更详细的可以查阅模块文档和 msgpack.org 网站。

谢谢。

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2011年12月4日星期日

Re: [PerlChina] 2011 CN Perl Advent Day 2 - qr/Moo?/

小牧今晚会把老的导上去。

在 2011年12月4日 下午4:47,Qiang (James) <shijialee@gmail.com>写道:
On 12/02/2011 07:07 PM, cnhack TNT wrote:
> advent.perlchina.org <http://advent.perlchina.org> 谁在管理?能否更新上
> 去啊。。。现在居然跳到某个公司的页面去了。。。
>

现在服务器由 Achilles 提供,我把这个问题和他说了,修复好后就可以看到以前
的 advent 了。

Qiang

>
>
> 2011/12/2 Fayland Lam <fayland@gmail.com <mailto:fayland@gmail.com>>
>
>     http://perlchina.github.com/advent.perlchina.org/2011/Moooo.html
>
>     =for advent_year 2011
>
>     =for advent_day 2
>
>     =for advent_title qr/Moo?/
>
>     =for advent_author Woosley Xu
>
>     每个人都喜欢面向对象编程,于是每个人都喜欢L<Moose>。但是有些时候,Moose
>     的加载速度成为了我们应用的瓶颈。这时候L<Mouse>出现了,L<Class::Accessor>
>     出现了。但这还不够,L<Mouse>仍然过于沉重,L<Class::Accessor>仍然只能提供
>     有限的特性。这时候,L<Moo>和L<Mo>出现了。
>
>     L<Moo>与L<Mouse>最大的区别是:它完全不提供任何B<meta object protocol>,
>     因此它的速度更快,体积更小。在将来的1.0版本,它计划可以和L<Any::Moose>一
>     起使用。
>
>     如果你仍然觉得L<Moo>太过重量级,那么L<Mo>是你的下一个选择。L<Mo>核心只提
>     供B<new>,B<extends>,B<has>这些功能,但你可以按照需求加载你所需要的功能
>     。
>
>     =begin code
>
>     use Mo qw'build default builder coerce is required';
>
>     sub BUILD {
>     my $self = shift;
>     ...
>     }
>
>     =end code
>
>     你还可以轻松的将L<Mo>压缩,然后包括到你的模块中去。
>
>     =begin code
>
>      >cat A.pm
>
>     package A;
>     # use Mo qw 'build default';
>
>      >mo-inline A.pm
>
>      >cat A.pm
>
>     package A;
>     # use Mo qw 'build default';
>     # The following line of code was produced from the previous line by
>     # Mo::Inline version 0.27
>     no
>     warnings;my$M=__PACKAGE__.::;*{$M.Object::new}=sub{bless{@_[1..$#_]},$_[0]};*{$M.import}=sub{import
>     warnings;$^H|=1538;my($P,%e,%o)=caller.::;shift;eval"no
>     Mo::$_",&{$M.$_.::e}($P,\%e,\%o,\@_)for@_;return
>     if$e{M};%e=(extends,sub{eval"no
>     $_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]{$n}=$_[1]:$_[0]{$n}};$m=$o{$_}->($m,$n,@_)for
>     sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for
>     keys%e;@{$P.ISA}=$M.Object};*{$M.'build::e'}=sub{my($P,$e)=@_;$e->{new}=sub{$c=shift;my$s=bless{@_},$c;my@B;do{@B=($c.::BUILD,@B)}while($c)=@{$c.::ISA};exists&$_&&&$_($s)for@B;$s}};*{$M.'default::e'}=sub{my($P,$e,$o)=@_;$o->{default}=sub{my($m,$n,%a)=@_;$a{default}or
>     return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$a{default}->(@_):$m->(@_)}}};@f=qw[build
>     default];use strict;use warnings;
>
>     =end code
>
>     从 Moose 到 Moo 到 Mo,下一个会是 M ? :)
>
>     谢谢
>
>
>     --
>     Fayland Lam // http://www.fayland.org/
>
>     --
>     您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论
>     组”论坛。
>     要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>     <mailto:perlchina@googlegroups.com>。
>     要取消订阅此网上论坛,请发送电子邮件至
>     perlchina+unsubscribe@googlegroups.com
>     <mailto:perlchina%2Bunsubscribe@googlegroups.com>。
>     若有更多问题,请通过
>     http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至
> perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN
> 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。




--
---------------------------
Achilles Xu

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] perlchina@googlegroups.com 的摘要 - “1 个主题”有 2 个帖子

不错,赞一个!
 
 
2011-12-05

罗学

发件人: perlchina
发送时间: 2011-12-04  16:38:11
收件人: 摘要收件人
抄送:
主题: [PerlChina] perlchina@googlegroups.com 的摘要 - "1 个主题"有 2 个帖子

网上论坛: http://groups.google.com/group/perlchina/topics

    Fayland Lam <fayland@gmail.com> Dec 03 08:24PM +0800  

    http://perlchina.github.com/advent.perlchina.org/2011/Firefox.html
     
    =for advent_year 2011
     
    =for advent_day 3
     
    =for advent_title WWW::Mechanize::Firefox
     
    =for advent_author Fayland Lam
     
    M<WWW::Mechanize::Firefox> 是个非常强大的工具。
     
    第一步是安装。安装该模块之前,需要安装一个 firefox 的 A<
    https://addons.mozilla.org/en-US/firefox/addon/mozrepl/|mozrepl> addon.
    Install 完毕后,重启然后启动 MozRepl (Tools -> MozRepl -> Start), 然后 cpan
    WWW::Mechanize::Firefox, 在安装的过程中,你可以看着 firefox, 你会发现它不停的打开 tab 然后做些测试,关掉
    tab。如果某些 tests fail, 你可以 force install 该模块。
     
    接下来做什么呢?大部分你用 firefox 加你双手能完成的任务,该模块都可以帮你自动化。
     
    简单的比如登录,填写表单,提交然后解析 HTML。对比 M<WWW::Mechanize>, 它可以无视 JavaScript 的阻拦。
     
    复杂的如运行 JavaScript, 模拟鼠标点击,触发 JavaScript 事件,截屏,保存文件,更改 firefox 配置等等。详细的可以参阅
    M<WWW::Mechanize::Firefox::Examples>
     
    下面是一个非常无聊的例子。但是除了该模块,你很难用其他模块来实现它。
     
    =begin code
     
    use strict;
    use warnings;
    use WWW::Mechanize::Firefox;
     
    my $mech = WWW::Mechanize::Firefox->new();
     
    $mech->get('
    http://www.google.com/codesearch#search/&q=WWW::Mechanize::Firefox&type=cs'
    );
    print $_->{innerHTML} . "\n" foreach $mech->selector('div.GEQUXKXGJB
    span:first-child');
     
    =end code
     
    谢谢。
     
     
    --
    Fayland Lam // http://www.fayland.org/

     

    Michael Zeng <galaxy2004@gmail.com> Dec 04 08:19AM +0800  

    厉害啊 , 能控制firefox
     
     
     
     
    2011/12/3 Fayland Lam <fayland@gmail.com>
     
     
    --
    Yours Sincerely
    Zeng Hong

     

您收到此邮件是因为您订阅了 Google 网上论坛 perlchina。
您可以通过电子邮件发帖
要取消订阅此网上论坛,请发送一封空邮件。
有关更多选项,请访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

谢谢!
很好用

在 2011年12月4日 下午6:48,joe jiang <lamp.purl@gmail.com>写道:
Hi I have made one for the 4th day:)

=for advent_year 2011

=for advent_day 4

=for advent_title Getopt::Euclid

=for advent_author Joe Jiang

写脚本的时候,最麻烦的两件事,无非是写文档和设计用户接口。有了 Getopt::Euclid,这两件事情居然开始变得十分有趣了。应该说,文档驱>动的程序,这样的创意并不少见,可是用来作为用户接口,这真的还是让人觉得十分恰当。

相比其他的脚本参数分析模块,这个模块的知名度比较低,不过它的作者 Damian Conway 还是十分知名的。现在的维护者 Florent Angly 看起来
也是参数模块这方面的爱好者,一同被他收纳的还有 Getopt::Declare。

具体的使用方法可以参考以下的测试代码:

=begin code

    #!/usr/bin/perl -wl

    use Getopt::Euclid;
    print for @{$ARGV{-i}};

    =head1 NAME

    demo-euclid - testing of module Getopt::Euclid

    =head1 VERSION

    This documentation refers to demo-euclid version 0.0.1

    =head1 USAGE

        demo-euclid [options]  -i[n][file] <file>

    =head1 REQUIRED ARGUMENTS

    =over

    =item  -i[n][file] <file>

    Specify input file

    =for Euclid:
        repeatable
        file.type:    readable
        file.default: '-'

    =back

=end code

有了以上的代码,你就可以这样测试一下了:

=begin code

    $ perl demo-euclid.pl --version
    This is demo-euclid.pl version 0.0.1

=end code

看上去还不错,这个工具脚本已经可以自动汇报版本号了!然后再测试一下正式的功能:

=begin code

    $ perl demo-euclid.pl -i /etc/passwd -i /etc/group
    /etc/passwd
    /etc/group

=end code

这正是我们的工具需要的功能,也就是分行(因为 #! 行的末尾有个 l 选项)打印文件名。另外,文件不存在,或者不可读的时候,脚本还会自>动报错:

=begin code


    $ perl demo-euclid.pl -i /etc/pass
    Invalid "-i[n][file] <file>" argument.
    <file> must be readable but the supplied value ("/etc/pass") isn't.
    (Try: demo-euclid.pl --help)

    $ perl demo-euclid.pl --help
    Usage:

    demo-euclid.pl -i <file>
    ...

=end code

看上去还挺专业的,连相应的帮助信息也有了。衷心希望你会喜欢上这个小模块!






2011/12/4 Michael Zeng <galaxy2004@gmail.com>
//comfort 重要的东西注意备份啊,


 
2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
准备生成 html 后再 commit 的。。。。


2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

Hi I have made one for the 4th day:)

=for advent_year 2011

=for advent_day 4

=for advent_title Getopt::Euclid

=for advent_author Joe Jiang

写脚本的时候,最麻烦的两件事,无非是写文档和设计用户接口。有了 Getopt::Euclid,这两件事情居然开始变得十分有趣了。应该说,文档驱>动的程序,这样的创意并不少见,可是用来作为用户接口,这真的还是让人觉得十分恰当。

相比其他的脚本参数分析模块,这个模块的知名度比较低,不过它的作者 Damian Conway 还是十分知名的。现在的维护者 Florent Angly 看起来
也是参数模块这方面的爱好者,一同被他收纳的还有 Getopt::Declare。

具体的使用方法可以参考以下的测试代码:

=begin code

    #!/usr/bin/perl -wl

    use Getopt::Euclid;
    print for @{$ARGV{-i}};

    =head1 NAME

    demo-euclid - testing of module Getopt::Euclid

    =head1 VERSION

    This documentation refers to demo-euclid version 0.0.1

    =head1 USAGE

        demo-euclid [options]  -i[n][file] <file>

    =head1 REQUIRED ARGUMENTS

    =over

    =item  -i[n][file] <file>

    Specify input file

    =for Euclid:
        repeatable
        file.type:    readable
        file.default: '-'

    =back

=end code

有了以上的代码,你就可以这样测试一下了:

=begin code

    $ perl demo-euclid.pl --version
    This is demo-euclid.pl version 0.0.1

=end code

看上去还不错,这个工具脚本已经可以自动汇报版本号了!然后再测试一下正式的功能:

=begin code

    $ perl demo-euclid.pl -i /etc/passwd -i /etc/group
    /etc/passwd
    /etc/group

=end code

这正是我们的工具需要的功能,也就是分行(因为 #! 行的末尾有个 l 选项)打印文件名。另外,文件不存在,或者不可读的时候,脚本还会自>动报错:

=begin code


    $ perl demo-euclid.pl -i /etc/pass
    Invalid "-i[n][file] <file>" argument.
    <file> must be readable but the supplied value ("/etc/pass") isn't.
    (Try: demo-euclid.pl --help)

    $ perl demo-euclid.pl --help
    Usage:

    demo-euclid.pl -i <file>
    ...

=end code

看上去还挺专业的,连相应的帮助信息也有了。衷心希望你会喜欢上这个小模块!





2011/12/4 Michael Zeng <galaxy2004@gmail.com>
//comfort 重要的东西注意备份啊,


 
2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
准备生成 html 后再 commit 的。。。。


2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

//comfort 重要的东西注意备份啊,


 
2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
准备生成 html 后再 commit 的。。。。


2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 写完 Advent Day 4 后,悲剧了。

准备生成 html 后再 commit 的。。。。

2011/12/4 Fayland Lam <fayland@gmail.com>
童鞋要注意经常 git commit or svn ci。

Thanks

2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
原文是《使用 AnyEvent::HTTP 的高速代理验证程序》

55555....


2011/12/4 cnhack TNT <cnhacktnt@gmail.com>
欲哭无泪啊,写了一下午的 Day 4, 最后生成 html 的时候直接按 tab 做了这么个操作:

cnhacktnt@Apollo:proxy$ pod2advent ae_proxy.pod  > ae_proxy.pod


愣了一下,直接就悲剧了啊,还没 ci 到 git 里, 写的东西都没了。。。vim也退出了,连临时文件都没了。。。555,我敲了好几个小时啊。。。!

原文是《使用 AnyEvent::HTTP 的告诉代理验证程序》,现在只剩下代码了,算了,附上代码吧(见附件).

使用方式是,收集一部分待验证的 HTTP 代理地址,按如下格式存成 proxy.txt 文件:


201.75.96.153:3128

76.111.254.51:1111

211.139.10.183:80

78.154.146.173:80

200.52.133.188:8080

85.26.197.206:3128

86.110.154.82:3128

122.72.12.90:80

203.114.146.116:3128

190.201.126.171:8080

202.108.5.114:80

209.115.188.53:80

90.182.144.34:3128

204.188.215.51:3128

69.247.158.186:1586

202.154.4.23:8080

190.5.199.18:3128

123.127.98.170:80

109.75.64.30:3128

64.37.51.144:3128


然后使用如下命令:

cat proxy.txt | perl ae_proxy.pl | tee ,result


就可以看到结果了,验证8000多个代理,耗时28秒。(如果待验证代理数量不足最大并发数,至少也要5秒,因为超时时间为5秒)


哭死!哭死!哭死!

血泪的教训,同学们打命令别太快了。。。。。


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。