Как я могу вернуть список хэш-ссылок с карты в Perl? - PullRequest
2 голосов
/ 10 сентября 2009

У меня есть следующий в основном нормальный код:

my $results = { data => [
   map {
      my $f = $_->TO_JSON;
      $f->{display_field} = $_->display_field($q);
      $f;
   } $rs->all
]};

Только я бы предпочел, чтобы это было больше похоже на следующее:

my $results = { data => [
   map {
      %{$_->TO_JSON},
      display_field => $_->display_field($q),
   }, $rs->all
]};

Но это дает синтаксическую ошибкуКак я могу делать то, что я хочу, или моя текущая версия лучше всего получается?

update : извините за лишнюю точку с запятой.Уже поздно здесь.Не уверен, как я это пропустил.Спасибо, ребята!

Ответы [ 4 ]

7 голосов
/ 10 сентября 2009

Это дает только синтаксическую ошибку, потому что ваш Perl считает, что вам нужно пропустить запятую после map { ... }, потому что он анализирует эту карту как блок, а не выражение. Помещение + впереди это исправит. Кроме того, вы не можете использовать точку с запятой в анонимном хэше:

my $results = { data => [
   map +{
#      ^----------------- plus sign added
      %{$_->TO_JSON},
      display_field => $_->display_field($q);
#                                           ^---- should be comma or nothing
   }, $rs->all
]};
3 голосов
/ 10 сентября 2009

Проблема в том, что Perl не смотрит вперед достаточно далеко, чтобы выяснить, означает ли { «начать анонимную ссылку на хэш» или «запустить блок кода». Он должен (в идеале) посмотреть соответствующий } и посмотреть, есть ли запятая или нет, и действовать соответственно, но это не так. Это только смотрит немного вперед и пытается угадать. И на этот раз это неправильно, и вы получите синтаксическую ошибку о запятой, которой не должно быть, за исключением того, что она не должна перемещаться.

perldoc -f map расскажет вам все об этом. По сути, это говорит о том, что если вы установите +{, Perl поймет, что это означает «не блок кода», и предположит, что это ссылка на хеш. Это, вероятно, причина вашей синтаксической ошибки. В качестве другого предложения можно сказать, что map({ HASH STUFF }, $rs->all) - держу пари, что Perl не догадывается, что здесь указана ссылка на код.

Я не мог заставить его работать, но не имел $rs или ->TO_JSON, или переменную с именем $q Я все равно не мог заставить это работать. Надеюсь, это поможет. Если нет, отправьте немного больше кода. Не волнуйтесь, мы не кусаемся.

Кроме того, пока мы занимаемся этим, почему бы не написать это так:

my $results;
$results->{data} = [ map MAGIC MAP STUFF, $rs->all ];

Возможно, возможно, будет более читабельным, особенно если вы добавляете много вещей к $results одновременно.

1 голос
/ 10 сентября 2009

Я не совсем уверен, какую структуру вы ищете. map в вашем первом примере уже возвращает список хэш-ссылок (каждая версия $f).

Если вы просто хотите, чтобы синтаксис был похож на ваш второй пример, то вы были почти правы; вам нужно избавиться от лишней точки с запятой в блоке карты и использовать пару фигурных скобок для создания анонимного хэша ref.

Что-то вроде:

my $results = { data => [
    map { { %{$_->TO_JSON},
            display_field => $_->display_field($q)
          }
    } $rs->all
]};
0 голосов
/ 10 сентября 2009

Я просто всегда использую карту в блочной форме и структурирую код так, чтобы его было легко разобрать. Хотя вы можете поставить + перед открывающим кудрявым, чтобы использовать форму выражения, действительно ли это так важно для вас?

Помимо всего прочего, ваш первый пример выглядит хорошо. Двигайтесь дальше и решайте реальные проблемы. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...