我正在进行一项生物信息学项目,该项目要求我从各种生物体中读取基因组数据(没有太多花哨,只需将其视为字符串)并将其插入数据库中.每次读取属于一个生物体,并且可以包含5000到5000万个基因,我需要在储存之前对其进行处理和分析.
目前执行此操作的脚本是用perl编写的,并且在完成所有计算之后,将结果存储在散列中,如下所示:
$new{$id}{gene_name} = $id;
$new{$id}{gene_database_source} = $gene_database_source
$new{$id}{product} = $product;
$new{$id}{sequence} = $sequence;
$new{$id}{seqlength} = $seqlength;
$new{$id}{digest} = $digest;
$new{$id}{mw} = $mw;
$new{$id}{iep} = $iep;
$new{$id}{tms} = $tms;
Run Code Online (Sandbox Code Playgroud)
在读取所有基因之后,插入将通过散列循环到eval {}语句中.
eval {
foreach my $id (keys %new) {
my $rs = $schema->resultset('Genes')->create(
{
gene_name => $new{$id}{gene_name},
gene_product => $new{$id}{product},
sequence => $new{$id}{sequence},
gene_protein_length => $new{$id}{seqlength},
digest => $new{$id}{digest},
gene_isoelectric_point => $new{$id}{iep},
gene_molecular_weight => $new{$id}{mw},
gene_tmd_count => $new{$id}{tms},
gene_species => $species,
species_code => $spc,
user_id => $tdruserid,
gene_database_source …
Run Code Online (Sandbox Code Playgroud) 我正在设置要部署的Catalyst Web应用程序,并希望从生产环境中删除-Debug
和StackTrace
Catalyst插件app.pm
。但是,由于我保留了测试环境,因此我想避免对此进行“硬编码”。相反,我想有一个定义环境的配置变量并相应地加载模块。所有源都在SVN上,如果我要更新存储库然后手动更改我在app.pm中加载的模块,它将变得混乱。
该应用程序当前使用configLoader
模块读取local_app.yml
具有所有配置的文件,该文件是未版本控制的,并允许对应用程序在开发,测试或生产环境中的工作方式进行一些控制;但是只有在启动应用程序之后(因此,在加载模块之后)才能读取这些内容。
这是的简化app.pm
:
package app;
use strict;
use warnings;
use Hash::Merge ();
use Sys::Hostname;
use Catalyst::Runtime '5.80';
use Catalyst qw/
-Debug
StackTrace
ConfigLoader
SomeOtherModule
AndYetAnotherOne
/;
__PACKAGE__->config(
# Some local config stuff
);
# Start the application
__PACKAGE__->setup();
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以不必使用Unix命令来找出正在运行该应用程序的主机?
我正在尝试从 AJAX 请求(使用 Catalyst)动态创建值列表,如下所示:
my @listofvalues = @{$params->{parameter_with_many_values}};
Run Code Online (Sandbox Code Playgroud)
然后我遍历列表以进行数据库插入(每个值一个)。因为我需要像上面那样循环各种列表,所以我需要访问列表的索引。我目前正在这样做:
foreach my $key (0 .. $#listofvalues){
$table_model->new({
field1 => $listofvalues[$key],
field2 => $x,
field3 => $another_listofvalues[$key]
field4 => $yet_another_listofvalues[$key]
});
}
Run Code Online (Sandbox Code Playgroud)
当请求中收到两个或更多元素时,这似乎工作正常。每当接收到单个元素时,我都会收到类似的错误
[error] Caught exception in pbitdb::Controller::Subjects->add "Can't use string ("1") as an ARRAY ref while "strict refs" in use at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 119."
Run Code Online (Sandbox Code Playgroud)
在这种情况下,1是接收到的值,第 119行是声明 @listofvalues 的行。
现在我已经尝试了几个来解决这个问题,但还没有找到任何可以双向工作的东西(对于单个或不同的值)。有什么建议?
我试图在一个eval
块下放置一些DBIX事务来进行所有事务,如果中间出现问题则不进行.
我有几个交易正在这样做,没有一个给我带来问题.只有一个:
我构建交易的方式相当棘手,而且值得的是,这些实际上是有效的.如果你愿意,我可以发布那段代码,但也许eval块就足够了:
eval {
for (my $sub = 0; $sub < $neuroexam_index; $sub++){
$transactions{neuroexams}{$sub}->insert;
}
} or die $!;
Run Code Online (Sandbox Code Playgroud)
问题是eval [error] Caught exception in pbitdb::Controller::Subjects->add "Died at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 411."
在我的控制台中显示错误(),但实际上执行插入.那为什么会这样?