2011年12月12日星期一

[PerlChina] 2011 CN Perl Advent Day 12: 最简单的 Git 服务器

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

=for advent_year 2011

=for advent_day 12

=for advent_title 最简单的 Git 服务器

=for advent_author 扶凯

=head1 简单介绍

目前大家的开发平台都从 svn 转成了 git 来管理应用了。说明老大们的影响力还真是不小啊. 近来查了一下资料配置 Apache 加 dav 来管理是相当的麻烦。现在用习惯了 M<Plack> 的方案来做 Web 的应用,太方便了。所以都感觉配置 Apache 之类是很麻烦的一个事情。

现在 Plack 很火,今天就介绍怎么使用 Plack 来实现 Git 服务器,在这,我们使用的是 M<Plack::App::DAV> 这个应用.

=head1 配置 Git 的客户端

因为 Git 的服务器在 Linux 中是使用的 Curl ,所以一定要先配置 Curl 的默认的用户和密码(注: 此设定不可略过).修改这个的默认的配置文件 ~/.netrc .

    machine example.com
    login USERNAME
    password PASSWORD

可以用这个来测试一下下面的 Git 的库认证(怎么样建一个 HTTP 的 Git 的库,请 Google .)

    curl --netrc --location http://git.example.com/project_name.git/HEAD 

会看到如下的输出 

    ref: refs/heads/master 

=head1 建立 DAV 的服务器
    
在 Plack 中有很多应用,都象下面这样的单行,比如我常用的静态文件服务器,就是个使用 Plack 的单行的 Perl 。这个 DAV 的服务器也能这样。
但只是 DAV 的服务器在 Git  中并行不通,因为一定需要用户认证。所面只是一个建立 DAV 服务器的演示.

    plackup -MPlack::App::DAV -e 'Plack::App::DAV->new->to_app'
    

=head2 最简单的 Git 服务器

最简单的 Git 的服务器。这个一定需要用户和密码才行。因为 Git 多人读取文件需要使用了一个外部锁认证,在这会根据用户名来做文件共享锁的识别。

    #!/usr/bin/perl
    use strict;
    use Plack::Builder;
    use Plack::App::DAV;
    
    my $gitPath = '/data/dev/git'; 
    my $app      = Plack::App::DAV->new(root => $gitPath )->to_app;
    
    builder {
        enable "Auth::Basic", authenticator => sub {
            my($username, $password) = @_; 
            return $username eq 'admin' && $password eq 'passwd';
        };  
        $app;
    };

启动这个 Git 的服务器

    plackup git.psgi

=head2 支持只读用户和读写用户的 Git 服务器 

这个需要使用使用 Plack 的中间件 Options 来管理读写的 HTTP 的方法.另外我还使用了一个 Junction 的模块,超级好用,也值得推荐.

    #!/usr/bin/perl
    use strict;
    use Plack::Builder;
    use Plack::App::DAV;
    use Perl6::Junction qw(any);
    
    
    my %userList = (
        test1 => 'pass1',
        test2 => 'pass2',
        );
    
    my @readOnly = qw( test1 );
    my $gitPath = '/data/dev/git'; 
    
    my $app = Plack::App::DAV->new(root => $gitPath )->to_app;
     
    builder {
        enable "Auth::Basic", authenticator => sub {
            my($user, $pass) = @_;
            return exists $userList{$user} and $pass eq $userList{$user};
        };
        enable 'Options', allowed => [qw/GET PUT POST DELETE  HEAD PROPPATCH PROPFIND MKCOL COPY MOVE LOCK UNLOCK/];
        enable_if { any(@readOnly) eq  $_[0]->{REMOTE_USER}  } 
            "Options", allowed => [qw/GET HEAD/];
        $app;
    };

启动这个 Git 的服务器

    plackup git.psgi

我们还可以使用其它的方法来管理读写用户,比如通过路径。这时我们可以使用 Plack::App::URLMap 的模块。


--
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: db-layout-graphviz

Thanks for that.  http://perlchina.github.com/advent.perlchina.org/2011/db-layout-graphviz.html 

2011/12/12 joe jiang <lamp.purl@gmail.com>
Sorry a mistake at copy paste, please replace DB<1> with this:

  DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return qq(`employees`.`$_->{REFERENCED_TABLE_NAME}`) for @{$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})} }


2011/12/12 joe jiang <lamp.purl@gmail.com>
=for advent_day 11

=for advent_title GraphViz::DBI::mysql

=for advent_author Joe Jiang

其实这还不是一个真正可用的模块,这里的名字只是预备将来发布的,所以请各位看官大家
手下留情,先不要注册掉它。

GraphViz::DBI 是一个基于 GraphViz 的模块,目标是用来进行数据库 ER 图的绘制,可以
输出的格式非常多,这里用 PNG 格式来举例。

要使用这个模块,首先要有一个可用的数据库 DBI 连接。然后要覆盖这个模块的外键参考依赖子程序,这样才能从特定数据库获取元数据。最后,还要用这个修正过的模块来输出图
片。

这里的 MySQL 数据库使用了样本数据库 employees,可以在网上下载 https://launchpad.net/test-db/employees-db-1。这里假定样本数据库已经创建并导入,并且用 DBI 登录 MySQL 的问题已经解决。

第一步,启动 Perl 调试器(perl -de 0),载入并修正 GraphViz::DBI:

=begin code

  DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return qq(`employees`.`@{[$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})->[0]->{REFERENCED_TABLE_NAME}]}`) }

=end code

这里通过查询了 MySQL 的元数据 information_schema.key_column_usage,从其中查找某个表的字段是否有参考的主表,若查询结果不为空的话,就返回表名作为结果,否则返回空
。

第二步,创建数据库连接,这里要求用户能够不用密码登录,且获得了查询 information_schema 的权限:

=begin code

  DB<2> use DBI; $d=DBI->connect(q(DBI:mysql:database=employees), q(), q())

=end code

第三步,命名临时文件,并正式驱动模块生成图片:

=begin code

  DB<3> x open F, q(>), q(tmp.1sKZjd1d4L.png); print F GraphViz::DBI->new($d)->graph_tables->as_png

=end code

欢迎尝试其他数据库,效果应该还不错 :)


--
您收到此邮件是因为您订阅了 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 访问此网上论坛。

2011年12月11日星期日

[PerlChina] Re: db-layout-graphviz

Sorry a mistake at copy paste, please replace DB<1> with this:

  DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return qq(`employees`.`$_->{REFERENCED_TABLE_NAME}`) for @{$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})} }

2011/12/12 joe jiang <lamp.purl@gmail.com>
=for advent_day 11

=for advent_title GraphViz::DBI::mysql

=for advent_author Joe Jiang

其实这还不是一个真正可用的模块,这里的名字只是预备将来发布的,所以请各位看官大家
手下留情,先不要注册掉它。

GraphViz::DBI 是一个基于 GraphViz 的模块,目标是用来进行数据库 ER 图的绘制,可以
输出的格式非常多,这里用 PNG 格式来举例。

要使用这个模块,首先要有一个可用的数据库 DBI 连接。然后要覆盖这个模块的外键参考依赖子程序,这样才能从特定数据库获取元数据。最后,还要用这个修正过的模块来输出图
片。

这里的 MySQL 数据库使用了样本数据库 employees,可以在网上下载 https://launchpad.net/test-db/employees-db-1。这里假定样本数据库已经创建并导入,并且用 DBI 登录 MySQL 的问题已经解决。

第一步,启动 Perl 调试器(perl -de 0),载入并修正 GraphViz::DBI:

=begin code

  DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return qq(`employees`.`@{[$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})->[0]->{REFERENCED_TABLE_NAME}]}`) }

=end code

这里通过查询了 MySQL 的元数据 information_schema.key_column_usage,从其中查找某个表的字段是否有参考的主表,若查询结果不为空的话,就返回表名作为结果,否则返回空
。

第二步,创建数据库连接,这里要求用户能够不用密码登录,且获得了查询 information_schema 的权限:

=begin code

  DB<2> use DBI; $d=DBI->connect(q(DBI:mysql:database=employees), q(), q())

=end code

第三步,命名临时文件,并正式驱动模块生成图片:

=begin code

  DB<3> x open F, q(>), q(tmp.1sKZjd1d4L.png); print F GraphViz::DBI->new($d)->graph_tables->as_png

=end code

欢迎尝试其他数据库,效果应该还不错 :)


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

[PerlChina] db-layout-graphviz

=for advent_day 11

=for advent_title GraphViz::DBI::mysql

=for advent_author Joe Jiang

其实这还不是一个真正可用的模块,这里的名字只是预备将来发布的,所以请各位看官大家
手下留情,先不要注册掉它。

GraphViz::DBI 是一个基于 GraphViz 的模块,目标是用来进行数据库 ER 图的绘制,可以
输出的格式非常多,这里用 PNG 格式来举例。

要使用这个模块,首先要有一个可用的数据库 DBI 连接。然后要覆盖这个模块的外键参考依赖子程序,这样才能从特定数据库获取元数据。最后,还要用这个修正过的模块来输出图
片。

这里的 MySQL 数据库使用了样本数据库 employees,可以在网上下载 https://launchpad.net/test-db/employees-db-1。这里假定样本数据库已经创建并导入,并且用 DBI 登录 MySQL 的问题已经解决。

第一步,启动 Perl 调试器(perl -de 0),载入并修正 GraphViz::DBI:

=begin code

  DB<1> use GraphViz::DBI; sub GraphViz::DBI::is_foreign_key { return qq(`employees`.`@{[$_[0]->{dbh}->selectall_arrayref(q{select REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from information_schema.key_column_usage where REFERENCED_COLUMN_NAME=? and COLUMN_NAME=? and TABLE_SCHEMA=? and TABLE_NAME=?}, {Slice => {}}, $_[2], $_[2], $_[1]=~m{(\w+)\W+(\w+)})->[0]->{REFERENCED_TABLE_NAME}]}`) }

=end code

这里通过查询了 MySQL 的元数据 information_schema.key_column_usage,从其中查找某个表的字段是否有参考的主表,若查询结果不为空的话,就返回表名作为结果,否则返回空
。

第二步,创建数据库连接,这里要求用户能够不用密码登录,且获得了查询 information_schema 的权限:

=begin code

  DB<2> use DBI; $d=DBI->connect(q(DBI:mysql:database=employees), q(), q())

=end code

第三步,命名临时文件,并正式驱动模块生成图片:

=begin code

  DB<3> x open F, q(>), q(tmp.1sKZjd1d4L.png); print F GraphViz::DBI->new($d)->graph_tables->as_png

=end code

欢迎尝试其他数据库,效果应该还不错 :)

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

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 访问此网上论坛。