Как передать строковую переменную как "запрос" для вызова менеджера?

Я пытаюсь сделать этот простой вызов:

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

который отлично работает Но возможно ли передать переменную для запроса. Что-то вроде:

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

или что-то подобное.

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);

Использование ссылок на структуры данных лучше, чем использование строк.

(Вы можете интерпретировать строку как исходный код Perl через eval, Это чрезвычайно мощно, но не все преобразуется в форму, которая может быть преобразована в эквивалентную структуру данных. Не используйте string-eval, за исключением хорошо продуманного метапрограммирования.)

Для получения дополнительной информации о ссылках и сложных структурах данных могут быть интересны perlref, perlreftut и perldsc.

Другие вопросы по тегам