Как передать строковую переменную как "запрос" для вызова менеджера?
Я пытаюсь сделать этот простой вызов:
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.