我正致力于催化剂设计数据库的前端。我是perl和催化剂的新手。我在控制器中遇到一个错误。
我想从一个表中获取基因名称,并将每个基因名称传递给子程序gene_name(调用子程序gene_name),该子程序将执行某些功能。我有些人如何使用基因名称获取列,但它们是以对其他表的哈希引用的形式。我对gene_name的调用无效。
知道如何将值传递给子程序而不是引用? 我的代码如下:
my @gene_list = $c->model('Gene::GeneTable')->search({
},{
column =>[qw/symbol/],
}
);
foreach my $gene (@gene_list){
push @gene_aliases, &gene_name($gene);
}
执行代码后我得到的错误如下:
DBIx::Class::ResultSet::find(): Can't bind a reference (MyApp::Model::Gene::GeneTable=HASH(0x7ff6d88b7c58))
已更新
我的gene_name()子程序在我已包含在控制器中的另一个模块中。现在我已经更改了for循环(在控制器中),如下所示,目前它正在将基因名称传递给gene_name()以获取别名(但查询保持不变):
foreach my $gene (@gene_list){
push @gene_aliases, &gene_name($gene-> symbol);
}
我正在访问视图文件中的@gene_aliases,如下所示:
[% FOREACH g in gene_aliases -%]
[% g %]
[% END -%]
上面的代码是在页面中获取哈希引用而不是名称。我无法在网页上显示基因名称。如果我在for循环中给出[%g.symbol%],那么页面将为空,没有错误消息。希望这是回答我的问题的足够信息。如果没有,我会详细说明。
我的SQL查询如下:
Select Symbol from GeneTable;
提前致谢
UPDATED2
由于我不是全职程序员,我在博客上提出这些问题。请帮我解决我的问题。如果我有来自用户的基因名称的搜索表单,并且该基因名称必须传递给gene_name()子程序,我该如何传递(到控制器以及如何调用gene_name())。请帮我解决这个问题。 我在view.tt中的表格如下:
<form method="post" action "[% c.uri_for('/gene')%]">
<input type="text" name="search_alias">
<input type="submit" name="alias_search" value="Search">
</form>
我的所有别名都在名为Alias的另一个表中,该表已在gene_name()子例程中使用。
答案 0 :(得分:1)
gene_name()
函数需要期望传递给它的GeneTable对象,或者你会这样调用它:gene_name($gene->symbol)
。
话虽如此,根据您提供的有限信息,控制器看起来并不适合这样做。
将gene_name作为Gene::GeneTable
本身的方法会更有意义,即:
package GeneTable;
...
sub gene_name {
my $self = shift;
my $gene_name = ... # do something with $self->symbol
$gene_name
}
...
这样->gene_name
方法可用于任何上下文中的任何GeneTable对象。
更新
听起来像gene_name()
(可能应该称为gene_aliases()
)是Gene对象的方法。将这样的转换转换为控制器并不符合良好的MVC理念。
大概你在某处有模型代码 - MyApp / Model / Gene /最有可能 - 这个sub应该存在于Gene/GeneTable.pm
中。然后你可以这样使用它:
[%- FOREACH g IN gene_list -%]
[% g.symbol %]<br/><ul>
[%- FOREACH gn IN g.gene_name -%]
<li>[% gn %]</li>
[%- END -%]
</ul>
[%- END -%]
在您的模板中,以及您拥有GeneTable对象或其集合的任何其他位置。
更新#2 关注更新的问题
当你在列表上下文中调用时, DBIx:Class
将返回一个对象数组。也许您需要添加一些Data::Dumper->Dumper()
调用来处理每个步骤返回给您的内容。
我建议您在致电->search()
后立即添加以下 行:
$c->log->debug("gene_list contains: ", Data::Dumper->Dumper(\@gene_list));
...并且可能在您填充之后对@gene_aliases进行等效调试。
这可能会让您更清楚地了解您从搜索中获得的内容,但我猜测您正在获取Gene::GeneTable
个对象。