如何将一个字符串变量作为“查询”传递给get Manager调用?

时间:2013-02-03 23:41:19

标签: perl mason rose-db-object

我正在尝试这个简单的电话:

DataB::testTable::Manager->get_testTable( query => [ id => $id, name => $name ] )

完美无缺。但是可以为查询传递变量。类似的东西:

$query = "id => $id , name => $name";
DataB::testTable::Manager->get_testTable( query => [ $query ] );

或类似的东西。

1 个答案:

答案 0 :(得分:1)

字符串和复杂的数据结构完全不同。

字符串是一系列代码点/字形/字节(取决于您的查找方式)。字符串是愚蠢的。字符串不擅长包含复杂和/或分层数据。 (以防万一:XML是纯粹的痛苦)

但是,您可以使用引用将任何Perl数据结构放入标量变量中。方括号创建对匿名数组的引用。

这些行组是等效的,除了引入变量名这一事实:

DataB::testTable::Manager->get_testTable( query   => [ id => $id, name => $name ] );

my @query = (id => $id, name => $name);
DataB::testTable::Manager->get_testTable(query => \@query); # the "\" takes a reference to a value

my @query = (id => $id, name => $name);
DataB::testTable::Manager->get_testTable(query => [@query]); # using "[]" to make the arrayref. The reference points to a copy of @query.

# this solution is probably best:
my $query = [ id => $id, name => $name ]; # "[]" makes an arrayref
DataB::testTable::Manager->get_testTable(query => $query);

使用对数据结构的引用比使用字符串更好。

(您可以通过eval将字符串解释为Perl源代码。这非常强大,但并非所有字符串都可以转换为可以等效为等效数据结构的表单。不要使用字符串 - eval,除了深思熟虑的元编程。)

有关参考和复杂数据结构的更多信息,perlrefperlreftutperldsc可能会很有趣。