Как заставить переменную обрабатываться как строка в Perl?

У меня есть объект JSON, который имеет пару значений ключа, и значение одной такой пары равно 0E10.

Проблема в том, что это значение должно быть строкой, но оно обрабатывается как число с плавающей запятой из-за наличия буквы E после числа, поэтому оно показывает 0 всякий раз, когда я печатаю это значение (0*e +10).

Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?

Я использую perl для передачи JSON и чтения его через Javascript. (Приемлемо решение на любом языке)

Это то, что я получаю, когда печатаю JSON.

КЛЮЧ1: 0E10

KEY2: "XYZ"

Вы можете ясно видеть, что если значение является строкой, оно помещается в кавычки (""), но для 0E10 оно не использует кавычки (").

Проблема в моем случае заключается в том, что я читаю JSON из API, управление которым мне недоступно. У меня есть серверная служба, написанная на Perl, которая передает JSON, возвращаемый API. Поэтому всякий раз, когда я нажимаю URL-адрес, вызывается внутренняя служба, написанная на Perl. Эта служба получает JSON от API и возвращает JSON службе, которая обращается к URL-адресу.


person Everybody Lies    schedule 10.07.2013    source источник
comment
не могли бы вы вставить такой json и как он декодируется?   -  person mpapec    schedule 10.07.2013
comment
у вас есть 0E10, а не "0E10", поэтому он не ведет себя как строка   -  person mpapec    schedule 10.07.2013
comment
Вам нужно показать людям, как вы создаете JSON. Тем временем, возможно, обсуждение вperldoc perlnumber поможет.   -  person G. Cito    schedule 10.07.2013
comment
JSON автоматически заключает строку в кавычки, но в данном случае этого не происходит, поскольку он обрабатывает ее как число с плавающей запятой.   -  person Everybody Lies    schedule 10.07.2013
comment
Вы говорите, что иностранный API обрабатывает key: 0E10 иначе, чем key: 0, и что вам нужен первый?   -  person ikegami    schedule 10.07.2013
comment
да .. внешний API обрабатывает ключ: 0E10 иначе, чем ключ: 0, и что вы хотите прежний   -  person Everybody Lies    schedule 10.07.2013
comment
почему бы не попробовать так $KEY1."" перед возвратом JSON. . сделает это строкой.   -  person    schedule 10.07.2013
comment
@Drt, ему не нужна строка. Он хочет сгенерировать следующий JSON: key: 0E10. Не key: 0, не key: '0E10'.   -  person ikegami    schedule 10.07.2013


Ответы (2)


Увидеть разницу:

Вариант А

use strict;
use warnings;
use JSON;

my $value = 12345;
my $hr = { KEY1=> $value, KEY2=> "XYZ" };
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: {"KEY2":"XYZ","KEY1":12345}

Вариант Б: двойные кавычки для $value, присвоенного KEY1

use strict;
use warnings;
use JSON;

my $value = 12345;
my $hr = { KEY1=> "$value", KEY2=> "XYZ" };
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: {"KEY2":"XYZ","KEY1":"12345"}
person Miguel Prz    schedule 10.07.2013
comment
Но когда я даю значение $ как 0E10, оно печатается как 0. Проблема в моем случае заключается в том, что я читаю JSON из API, управление которым мне недоступно. У меня есть серверная служба, написанная на Perl, которая передает JSON, возвращаемый API. Поэтому всякий раз, когда я нажимаю URL-адрес, вызывается внутренняя служба, написанная на Perl. Эта служба получает JSON от API и возвращает JSON службе, которая обращается к URL-адресу my $value = 0E10; my $hr = {KEY1=>$value, KEY2=>XYZ}; мой $json = encode_json $hr; напечатать $json, \n; #‹-- печатает: {KEY1:0,KEY2:XYZ} - person Everybody Lies; 10.07.2013
comment
Информация о строке уже потеряна, когда вы произносите my $value = 0E10. Вы должны сказать my $value = "0E10". - person mob; 10.07.2013
comment
0E10 не имеет смысла в числовом контексте, потому что это 0*10**10 = 0... возможно, вам нужно число 1E10 ¿? - person Miguel Prz; 10.07.2013

Если вы хотите сгенерировать key: 0E10 (в отличие от key: 0 и key: '0E10'), вам придется сгенерировать собственный JSON. В Perl нет способа хранить 0E10 иначе, чем 0E9. (Как и JavaScript, Java, C, C++,...)

Если вы готовы принять любую экспоненту, вам, вероятно, все равно придется создать свой собственный JSON. В Perl нет системы типов, а кодировщики JSON обычно используют целочисленную запись для целых чисел (в математическом смысле).

Я специально протестировал JSON::XS и JSON::PP будет использовать 0 для нуля, хранящегося внутри как число с плавающей запятой.

$ perl -MJSON::XS -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x8002b7d8) at 0x800720f0
  REFCNT = 1
  FLAGS = (NOK,pNOK)
  IV = 1
  NV = 0
  PV = 0
[0]

$ perl -MJSON::PP -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x801602b0) at 0x8008e520
  REFCNT = 1
  FLAGS = (NOK,pNOK)
  IV = 1
  NV = 0
  PV = 0
[0]

(NOK указывает, что скаляр содержит значение, хранящееся как число с плавающей запятой.)

person ikegami    schedule 10.07.2013