3 votes

Comment envoyer une valeur booléenne à partir d'un script Perl sans les convertir en chaîne de caractères

Je transmets une structure de données Perl à encode_json, et utilise sa valeur de retour comme entrée pour poster vers une API REST.

Exemple:

$data = (input1 => true);
$json_data = encode_json($data);
print $json_data; // Affiche: ["input1":"true"]

$url= http://api.example.com/resources/getDataAPI
$headers = {Accept => 'application/json', Authorization => 'Basic ' . encode_base64($username . ':' . $password)};

$client = REST::Client->new();
$client->POST($url,($json_data,$headers));

Cela fonctionnait très bien.

Récemment, un autre développeur a ajouté quelques vérifications de validité des paramètres d'entrée, et REST n'accepte strictement que des valeurs booléennes, sans guillemets.

Je dois maintenant envoyer mes données d'entrée comme

$data = '["inout1":true]'
$client = REST::Client->new();
$client->POST($url,($data,$headers));

Tous mes scripts échouent car les données d'entrée sont encodées au format JSON en utilisant la fonction encode_json.

Je peux former manuellement des données JSON, mais les données d'entrée peuvent parfois être très volumineuses. Je ne peux pas les identifier et les modifier à chaque fois.

Y a-t-il un moyen de réussir à passer une valeur booléenne sans guillemets ?

13voto

simbabque Points 11124

Utiliser true et false directement en Perl est une erreur de syntaxe sous use strict car les motifs non qualifiés ne sont pas autorisés.

Je suppose que vous utilisez JSON ou JSON::XS. Ceux-ci utilisent des références scalaires pour indiquer TRUE et FALSE. Plus précisément, \1 et \0.

$data = ( input1 => \1 );

Voici la documentation pertinente de JSON::XS, qui permet également d'utiliser Types::Serializer::True et Types::Serializer::False :

Ces valeurs spéciales du module Types::Serialiser deviennent respectivement les valeurs vrai (true) et faux (false) de JSON. Vous pouvez également utiliser \1 et \0 directement si vous le souhaitez.

Et la documentation de JSON, où JSON::true et JSON::false peuvent également être utilisés :

Ces valeurs spéciales deviennent respectivement les valeurs vrai (true) et faux (false) de JSON. Vous pouvez également utiliser \1 et \0 directement si vous le souhaitez.


Si vous insistez pour utiliser true sans guillemets comme dans my $foo = true, vous pourriez créer des sous-programmes ou des constantes (qui sont en réalité des sous-programmes) qui retournent \1 et \0.

use constant false => \0;
sub true () { return \1 } # note the empty prototype

$data = ( input1 => true, input2 => false );

Comme Sinan le souligne dans son commentaire, il est plus rapide d'utiliser une constante, à moins d'inclure un prototype vide (le () dans la définition du sous-programme), car de cette manière Perl peut intégrer l'appel.

À mon avis, cela est moins clair que d'utiliser simplement les références. Pensez toujours au prochain intervenant travaillant sur ce code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X