标签归档:Perl

Perl实现排列组合

Published / by clownwyb / Perl实现排列组合有3条评论

最开始是想对一个大样本数据集重新排序随机化,只想用简单的随机数生成就设想能够解决,暂时没有考虑分层随机化等方法。

一开始我是用hash的key,不断判断这个key是否exist来防止随机数重复生成,对于几万以内的数据还比较快和方便:
do  
{
$r=int(rand($number));
}while(exists($hash{$r}) || $r>=$number);
$hash{$r}=$line;
但是若number达到几十万之后,速度会非常慢,而且几乎变成了死循环,因为当随机数把0~number-1范围内的数据大部分都产生过后,有非常非常低的概率去随机产生那剩下的一些数值,从极大似然定律来讲,无限小的概率等于不可能事件,因此这么编程是有问题的,对于“大数据”而言。
所以可以用排列来解决这个随机重排列表的问题(不过该方法还是麻烦。其实最简单的方法是随机出N个数字后进行排序,他们的排序后的索引就是1~N的随机数----2013-12-21补充)。
这就涉及到如何进行perl的排列(permutation)和组合(combination)。
================================================================
需要先用PPM安装Algorithm::Combinatorics这个包(或者Math::Combinatorics这个包)
然后就可使用了!!
测试结果:Algorithm::Combinatorics安装失败,但是Math::Combinatorics安装成功。
use Algorithm::Combinatorics qw(combinations permutations);
@data=(1,2,3,4,5);
my $iter = combinations(@data, 2);
while (my $c = $iter->next) {
   print join(" ",@$c),"n";
}

my $iter = permutations(@data);
while (my $c = $iter->next) {
   print join(" ",@$c),"n";
}

Perl 三目运算

Published / by clownwyb / Leave a Comment

三目运算冒号左右为表达式或者代码块,所以第二行等同于第三行,而不等同于第四行,第四行输出结果会一直为$test=321. 第四行和第五行效果一样,应该跟编译的时候生成的分析树有关

$wf_workflow=1;

$wf_workflow?($test=1233):($test=321); 
#if($wf_workflow){$test=1233;}else{ $test=321} 
#$wf_workflow?$test=1233:$test=321;  ; 
$wf_workflow?$test=1233:$test,$test=321;

Perl @INC

Published / by clownwyb / Leave a Comment

关于@INC的注意事项* 当你提交一个use MyModule的时候,就会指示perl去搜索@INC数组中是否有此模块名。@INC通常包含: /perl/lib /perl/site/lib.“.”这个目录表示当前的工作目录。核心模块是安装在perl/lib目录中,非核心模块安装在perl/site/lib目录中。你可以向@INC中添加自定义目录。像下面这样: BEGIN { push @INC, '/my/dir' } # or BEGIN { unshift @INC, '/my/dir' } # or   use lib '/my/dir';我们需要使用BEGIN块在编译时向@INC中添加值,此时是perl检查模块的时刻。 如果你等到程序被编译的时候就太晚了, perl会抛出一个异常,说“在@INC中无法找到MyModule”.使用push还是unshift方法添加值的区别是,perl搜索@INC的顺序 是从@INC中的第一个目录开始的。如果你在/perl/lib/、/perl/site/lib/和./中都有一个MyModule模块的话,那么 /perl/lib中的模块将首先被找到并使用。use lib用法可以起到和BEGIN{unshift @INC,$dir}一样的效果-请参看"perlman:lib:lib":http://www.perlmonks.org/?node= perlman%3Alib%3Alib . *use Foo::Bar意味着什么* use Foo::Bar并不意味着在@INC的目录中寻找一个叫做Foo::Bar.pm的模块文件。它的意思是在@INC的目录中寻找一个叫做‘Foo’的 “子目录”,然后在其中找一个叫做“Bar.pm”的“模块”。现在,如果我们成功"use"了一个模块,那么我们就可以通过完整的包路径语 法&PACKAGE::FUNCTION使用这个模块中的所有函数。当我们说&Foo::Bar::some_func的时候,我们指的 是“包的名字”而不是那个在use中曾使用的包含路径的文件名。这会允许你可以在一个use过的文件中包含很多包名字。实际使用中这些名字通常是相同的。