当double具有'exact'整数值时,如下所示:
double x = 1.0;
double y = 123123;
double z = -4.000000;
Run Code Online (Sandbox Code Playgroud)
当通过(int)x,(int)y,(int)z强制转换为整数类型时,它是否可以保证正确地舍入到1,123123和-4?(并且不截断为0,123122或-5 b/c的浮点怪异).我问b/c根据这个页面(这是关于lua中的fp,一种默认只有双倍数字类型的语言),讨论如何根据IEEE 754对双精度进行整数运算,但我不是确定当使用整数类型参数调用C函数时,我需要担心手动舍入双精度,或者当双精度具有精确整数值时需要注意.
我开发并维护了一个包含50多个脚本的生物信息学应用程序套件,其部署过程非常混乱:
这显然是几代开发人员有机增长的混乱.理想情况下,我想从内部库和各种相关脚本组创建cpan-installable发行版,并使用模块依赖项让cpan为我安装它们.
但我不知道这样做的最好的办法是,B/C我仍然需要分发Perl本身,就不得不写某种非命令行界面CPAN的,控制第三方CPAN的确切版本模块,默认指向我的"DarkPan",我将存储模块,如何推送更新等.
我不认为我可以使用PerlApp或Par,因为afaik用于捆绑单个脚本,而不是整个套件.
任何建议高度赞赏.
我已经开始了module-starter
(带--builder=Module::Build
).我想用来SQL::Library
将我的SQL收集到一个.ini文件中......但是为了在运行时找到该文件,我需要知道它的确切路径.如何在运行时获取模块"数据目录"的路径?
到目前为止,我一直在使用FindBin(比如"$FindBin::Bin/../../path/to/module/datafiles/foo.ini"
,但我发现它不是很强大(例如,当PATH中两个不同的目录中有两个具有相同名称的程序时,它似乎会中断).
我想在内存中创建和操作(4字节)整数的大数组.从大到大,我的意思是数亿.阵列中的每个细胞将充当染色体上位置的计数器.我需要的只是让它适合内存,并快速(O(1))访问元素.我正在计算的东西不是稀疏特征,所以我不能使用稀疏数组.
我不能用常规的perl列表来做这个,因为perl(至少在我的机器上)每个元素使用64个字节,所以我使用的大多数生物的基因组太大了.我已经尝试通过SQLite和散列绑定将数据存储在磁盘上,尽管它们有效,但速度很慢,特别是在普通驱动器上.(当我在4驱动器raid 0上运行时,它的工作原理相当不错).
我以为我可以使用PDL数组,b/c PDL就像C一样存储它的数组,每个元素只使用4个字节.但是,与perl列表相比,我发现更新速度极慢:
use PDL;
use Benchmark qw/cmpthese/;
my $N = 1_000_000;
my @perl = (0 .. $N - 1);
my $pdl = zeroes $N;
cmpthese(-1,{
perl => sub{
$perl[int(rand($N))]++;
},
pdl => sub{
# note that I'm not even incrementing here just setting to 1
$pdl->set(int(rand($N)), 1);
}
});
Run Code Online (Sandbox Code Playgroud)
返回:
Rate pdl perl
pdl 481208/s -- -87%
perl 3640889/s 657% --
Run Code Online (Sandbox Code Playgroud)
有谁知道如何提高pdl set()性能,或者知道可以实现这一目标的不同模块?
我正在阅读Mojolicious :: Guides :: Growing的部分,它告诉你如何将Mojolicious :: Lite发展成一个"组织良好"的cpan-uploadable应用程序.首先,它告诉您将M :: L应用程序拆分为启动脚本和应用程序类.
package MyApp;
use Mojo::Base 'Mojolicious';
use MyUsers;
sub startup {
my $self = shift;
# ...auth stuff omitted...
my $r = $self->routes;
$r->any('/' => sub {
my $self = shift;
my $user = $self->param('user') || '';
my $pass = $self->param('pass') || '';
return $self->render unless $self->users->check($user, $pass);
$self->session(user => $user);
$self->flash(message => 'Thanks for logging in.');
$self->redirect_to('protected');
} => 'index');
$r->get('/protected' => sub {
my $self = shift;
return …
Run Code Online (Sandbox Code Playgroud) 我试图通过Inline :: C编写一个C函数,它将创建并返回一个对Perl的数组引用...下面是我的脚本和输出.我是否正在分配阵列并正确填充它?特别是,我创建了一个临时数组SV*
并传递给它们av_make
,并返回一个用它创建的引用newRV_noinc
.当我使用Devel :: Peek :: Dump查看返回的数组ref时,引用计数似乎很好,它看起来与直接在perl中创建的相同数据结构相同.
我还不明白什么是致命sv_2mortal
的,或者我是否需要它.显然,Inline :: C会自动调用sv_2mortal
返回的函数SV*
,这些函数可能相关也可能不相关.
#!/usr/bin/env perl
use strict;
use warnings FATAL => "all";
use 5.010_000;
use Data::Dumper;
use autodie;
use Inline ('C');
use Devel::Peek;
my $from_perl = [0 .. 9];
my $from_c = inline_array_maker(10); #same as above but in C
say Dumper $from_perl;
Dump($from_perl);
say Dumper $from_c;
Dump($from_c);
__END__
__C__
SV* (int len){
int i;
SV ** tmp_buffer;
AV * arr;
tmp_buffer …
Run Code Online (Sandbox Code Playgroud) 问题:我在Windows和*nix上都生成了数据(主要是CSV格式),主要在*nix上处理.Windows使用CRLF进行行结束,Unix使用LF.对于任何特定文件,我不知道它是否有窗口或*nix行结尾.到目前为止,我一直在写这样的东西来处理差异:
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
Run Code Online (Sandbox Code Playgroud)
在*nix上,\n部分相当于chomping,如果是windows生成的文件,则另外删除\ r \n(CR).
但是现在我想要Text :: CSV_XS b/c我开始使用带引号的数据获取更奇怪的数据文件,可能还有嵌入式换行符等.为了让这个模块读取这些文件,Text :: CSV_XS: :getline()要求您指定行尾字符.(我无法读取上面的每一行,tr/\n\r // d,然后用Text :: CSV b/c解析它不能正确处理嵌入式换行符).如何正确检测任意文件是否使用windows或*nix样式行结尾,所以我可以告诉Text :: CSV_XS :: eol()如何chomp()?
我在CPAN上找不到简单检测行结尾的模块.我不想首先通过dos2unix转换我的所有数据文件,b/c文件很大(数百千兆字节),并且每个文件花费10多分钟来处理这么简单的事情似乎很愚蠢.我想过编写一个函数来读取文件的前几百个字节并计算LF和CRLF,但我拒绝相信这没有更好的解决方案.
有帮助吗?
注意:所有文件要么具有完全的Windows行结尾,要么具有*nix结尾,即它们不会混合在一个文件中.
Moose对象似乎是带有成员变量作为条目的祝福hashrefs.使用哈希语法访问成员是否安全?我想要的只是获取/设置成员变量的简单能力,但我发现perl生成的访问器的速度对于我的应用程序来说是不可接受的,直到我考虑在非驼鹿OO中重写它.是的,我知道优化是一种可以判处死刑的罪行,但我有一个十亿+行文件并添加一个简单的行计数器变量可以增加十亿+函数调用,这可以在一次运行中增加几小时.
显示慢度(100x)的示例:
package Bullwinkle;
use strict;
use warnings;
use Moose;
has 'x' => (is => 'rw', default => 0);
# counter is also slow
has 'counter' => (
traits => ['Counter'],
is => 'ro',
isa => 'Num',
default => 0,
handles => {
inc_counter => 'inc',
},
);
package main;
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
my $bull = Bullwinkle->new();
my $hash = { x => 0 };
cmpthese(-1,{
bull => sub{
$bull->x(1 + $bull->x());
},
bull_direct => …
Run Code Online (Sandbox Code Playgroud) 有没有权威和/或事实上的文件详细说明CPAN如何工作,足够详细,任何人都可以使用它从头开始重建CPAN而不依赖口头传统和传闻?记录目录结构的东西,应该在分发中的文件,版本号如何真正起作用,谁可以上传search.CPAN.org网站上列出的内容和内容等等?
如何创建一个IO :: All对象来读取文件处理ARGV和DATA?
use strict;
use warnings;
use 5.010_000;
use IO::All;
# none of these work...
my $io = io->handle(DATA);
my $io = io->handle(\*DATA);
my $f = \*DATA;
my $io = io->handle($f);
my $io = io->handle({$f});
my $io = io->handle({DATA});
my $io = io->handle({\*DATA});
say $io->slurp();
__DATA__
FOO
BAR
QUUX
Run Code Online (Sandbox Code Playgroud)