Nп/п : 19 из 19
От : Roman Danilov 2:5020/570.54 22 окт 23 02:11:10
К : Gennadij Pastuhov 22 окт 23 03:01:04
Тема : Re: Как передать в json двоичное число?
----------------------------------------------------------------------------------
@MSGID: 2:5020/570.54 65345ed5
@REPLY: 2:5036/26 64d24e00
@CHRS: CP866 2
@TZUTC: 0300
@TID: hpt/w32-mgw 1.4.0-sta 30-03-12
Привет, Gennadij!
Ответ на сообщение Gennadij Pastuhov (2:5036/26) к All, написанное
08 авг 23 в 17:07:
GP> , т.е., незначащие нули усеклись. А как их сохранить?
То, о чем говорил 11 августа: написать свою реализацию энкода json
совсем нетрудно.
Цитирую упражнение с ресурса STEPIK с решением:
STEPIK.ORG, Введение в Perl
6.3 Сериализация данных
Ваша задача реализовать простой сериализатор JSON. т.е. функцию
serialize($ref), которая будет возвращать JSON-строку. Вам в помощь реализована функция
is_number($sv), которая возвращает истину если в скаляре содержится число.
Пример :
$VAR1 = {
`b` => [
1,
`2`,
3
],
`a` => 1,
`c` => {
`b` => 2,
`a` => 1
}
};
serialize($VAR1) == `{"b":[1,"2",3],"a":1,"c":{"b":2,"a":1}}`
Напишите программу. Тестируется через stdin -> stdout
Мой зачтённый вариант решения был таков (видно, что надо применить
немного рекурсии, и всё получится):
sub serialize {
my ($value) = @_;
if (ref($value) eq `ARRAY`)
{
my @i_arr = @{$value};
my @d;
for (@i_arr)
{
push (@d, serialize($_));
}
return `[`.join(`,`,@d).`]`;
}
elsif (ref($value) eq `HASH`)
{
my %i_slov = %{$value};
my @c;
for (keys %i_slov)
{
push (@c, `"`.$_.`":`.serialize(${$value}{$_}));
}
return `{`.join(`,`,@c).`}`;
}
else
{
my $i_value=$value;
if (is_number($i_value))
{
return $i_value;
}
else
{
return `"`.$i_value.`"`;
}
}
}
К сожаленью, протестировать ее в своей среде не могу, т.к. не
представляю как сделать свою корректную реализацию функции is_number(). Если
обвязку, работающую с незначащими нулями, создать удастся, то засунуть эти
изменения в приведенный выше код, как видно, не должно составить большого
труда.
С уважением - Roman
--- GoldED+/W32-MINGW 1.1.5-b20120519 (Kubik 3.0)
* Origin: Делай всё сам, не грузи ближнего. R2AMO. (2:5020/570.54)
SEEN-BY: 469/122 4500/1 5010/275 5020/290 545 570
715 848 921 1042 4441 9696
SEEN-BY: 5020/12000 5022/2 128 5023/24 5026/49
5030/500 1081 5034/13 5057/19
SEEN-BY: 5059/37 5061/15 5066/18 5075/128
@PATH: 5020/570 715 4441