Comment puis-je retourner une liste de hashrefs à partir d'une carte en Perl?

StackOverflow https://stackoverflow.com/questions/1403607

  •  05-07-2019
  •  | 
  •  

Question

J'ai le code suivant généralement ok:

my $results = { data => [
   map {
      my $f = 

J'ai le code suivant généralement ok:

my $results = { data => [
   map {
      %{

J'ai le code suivant généralement ok:

my $results = { data => [
   map {
      my $f = 

J'ai le code suivant généralement ok:

<*>

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->TO_JSON; $f->{display_field} =

J'ai le code suivant généralement ok:

<*>

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->display_field($q); $f; } $rs->all ]};

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->TO_JSON}, display_field =>

J'ai le code suivant généralement ok:

my $results = { data => [
   map {
      my $f = 

J'ai le code suivant généralement ok:

<*>

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->TO_JSON; $f->{display_field} =

J'ai le code suivant généralement ok:

<*>

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->display_field($q); $f; } $rs->all ]};

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->display_field($q), }, $rs->all ]};

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->TO_JSON; $f->{display_field} =

J'ai le code suivant généralement ok:

<*>

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

->display_field($q); $f; } $rs->all ]};

Seulement, je préférerais que cela ressemble davantage à ce qui suit:

<*>

Mais cela donne une erreur de syntaxe. Comment puis-je faire ce que je veux, ou ma version actuelle est-elle la meilleure?

mettre à jour : désolé pour le point-virgule supplémentaire d'avant. Il est tard ici. Je ne sais pas comment j'ai raté ça. Merci les gars!

Était-ce utile?

La solution

Cela ne donne qu'une erreur de syntaxe parce que Perl pense que vous devez omettre la virgule après map {...} , car il analyse cette map comme étant un bloc, pas une expression. Mettre + au premier plan résoudra le problème. De plus, vous ne pouvez pas avoir de point-virgule dans un hachage anonyme:

my $results = { data => [
   map +{
#      ^----------------- plus sign added
      %{

Cela ne donne qu'une erreur de syntaxe parce que Perl pense que vous devez omettre la virgule après map {...} , car il analyse cette map comme étant un bloc, pas une expression. Mettre + au premier plan résoudra le problème. De plus, vous ne pouvez pas avoir de point-virgule dans un hachage anonyme:

<*>->TO_JSON}, display_field =>

Cela ne donne qu'une erreur de syntaxe parce que Perl pense que vous devez omettre la virgule après map {...} , car il analyse cette map comme étant un bloc, pas une expression. Mettre + au premier plan résoudra le problème. De plus, vous ne pouvez pas avoir de point-virgule dans un hachage anonyme:

<*>->display_field($q); # ^---- should be comma or nothing }, $rs->all ]};

Autres conseils

Le problème est que Perl ne regarde pas assez loin vers l'avant pour déterminer si { signifie "commencer une référence de hachage anonyme". ou "commencer un bloc de code". Il devrait (idéalement) consulter le } correspondant et voir s'il existe ou non une virgule et agir en conséquence, mais ce n'est pas le cas. Il ne fait qu’avancer un peu et essaie de deviner. Et cette fois, c’est faux, et vous obtenez une erreur de syntaxe concernant une virgule qui ne devrait pas être là, sauf que cela devrait être fait, ne le déplacez pas.

la carte perldoc -f vous dira tout à propos de ça. En gros, cela signifie que si vous mettez + {, Perl comprendra que cela signifie "pas un bloc de code". et devinez que c'est une référence de hachage. C'est probablement la cause de votre erreur de syntaxe. Comme autre suggestion, il pourrait être utile de dire map ({HASH STUFF}, $ rs- > all) - Je parie que Perl ne devinera pas qu'il s'agit d'une référence de code.

Je ne pouvais pas le faire fonctionner, mais je n'avais pas $ rs , un - > TO_JSON ou une variable nommée $ q . De toute façon, je ne pouvais rien faire de ça. J'espère que ça aide. Sinon, postez un peu plus de code. Ne vous inquiétez pas, nous ne mordons pas.

Aussi, pendant que nous y sommes, pourquoi ne pas l'écrire de cette façon:

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

Peut-être serait-il plus lisible, en particulier si vous ajoutez beaucoup d'éléments à $ results en même temps.

Je ne suis pas tout à fait sûr du type de structure que vous recherchez. La map de votre premier exemple renvoie déjà une liste de hashrefs (chaque version de $ f ).

Si vous souhaitez simplement une syntaxe similaire à votre deuxième exemple, vous aviez presque raison; vous devez vous débarrasser des points-virgules superflus de votre bloc de carte et utiliser une paire de curlies pour créer un hachage anonyme.

Quelque chose comme:

my $results = { data => [
    map { { %{

Je ne suis pas tout à fait sûr du type de structure que vous recherchez. La map de votre premier exemple renvoie déjà une liste de hashrefs (chaque version de $ f ).

Si vous souhaitez simplement une syntaxe similaire à votre deuxième exemple, vous aviez presque raison; vous devez vous débarrasser des points-virgules superflus de votre bloc de carte et utiliser une paire de curlies pour créer un hachage anonyme.

Quelque chose comme:

<*>->TO_JSON}, display_field =>

Je ne suis pas tout à fait sûr du type de structure que vous recherchez. La map de votre premier exemple renvoie déjà une liste de hashrefs (chaque version de $ f ).

Si vous souhaitez simplement une syntaxe similaire à votre deuxième exemple, vous aviez presque raison; vous devez vous débarrasser des points-virgules superflus de votre bloc de carte et utiliser une paire de curlies pour créer un hachage anonyme.

Quelque chose comme:

<*>->display_field($q) } } $rs->all ]};

J'utilise toujours map sous la forme de bloc et structure le code pour qu'il soit facile à séparer. Bien que vous puissiez mettre un + devant l'ouverture curly pour utiliser la forme d'expression, est-ce vraiment important pour vous?

Mis à part tout ce qui se passe, votre premier exemple semble bien. Avancez et résolvez de vrais problèmes. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top