Назначение ключей значениям из результатов внешней команды

#perl

Вопрос:

Я застрял. Я запускаю команду из внешнего инструмента. Выходные данные этого инструмента представлены в следующем формате:

 {
 {
   Dan Summers

   Male
   Funds less than $100
   March 23, 2021 1:58:24 PM
   Undisclosed
 }
 {
   Susan August

   Female
   no funds
   March 23, 2021 7:58:24 AM
   Expired
 }
}
 

Мне нужно присвоить ключ значениям, чтобы позже выполнить некоторое сопоставление, а также распечатать его в виде одной строки, но я не уверен, как это сделать.
Сначала я провел некоторый поиск и замену, чтобы сделать его однострочным. но потом меня осенило, что у меня все еще нет способа добавить ключи. в качестве примера того, что я сделал:

 use strict;
use warnings;
my $result = `command`;
$result =~ s/n//g;
print "$result";
 

что дало мне результат:

 { {   Dan Summers   Male   Funds less than $100   March 23, 2021 1:58:24 PM   Undisclosed } {   Susan August   Female   no funds   March 23, 2021 7:58:24 AM GMT 02:00   Expired }}
 

Затем я попытался добавить ключи, прежде чем даже пытаться сделать его строкой, но, очевидно, это не разделенный массив, поэтому использование $arr[0] не сработает.. так что мы все знаем, как это прошло:

 use strict;
use warnings;
my @result = `command`;
for my $res(@result) {
    print "line: $res[0]"
}
 

Как я могу добавить ключи, чтобы получить что-то похожее на результат JSON? Что-то вроде:

 {
 {
   name: Dan Summers
   gender: Male
   fundstatus: Funds less than $100
   updated: March 23, 2021 1:58:24 PM
   status: Undisclosed
 } ....
 

Был бы очень признателен за некоторые рекомендации здесь.

ПРАВКА забыла упомянуть. У внешнего инструмента нет никаких критериев соответствия для поиска имени пользователя или чего-либо в этом роде. Если вы запустите инструмент и в результате окажется 10 человек, он напечатает все 10 в формате первого примера.. Так же, как и к вашему сведению, поэтому невозможно извлечь только информацию о том, где пользователь «Дэн Саммерс».

Именно поэтому я делаю это, чтобы я мог создать эту функциональность вне инструмента.

Комментарии:

1. Вы хотите обработать эти данные в той же программе?

2. Привет @simbabque. Спасибо вам за ваш ответ. Я не могу, инструмент находится вне моего контроля, поэтому мне просто нужно извлечь данные, а затем с помощью perl я вставлю данные в базу данных, но для этого мне нужны ключи.

3. Вот что я имел в виду. Итак, вы получаете эти данные, но вся последующая обработка происходит в вашем коде?

4. Правильно, Да, @simbabque.

5. Я бы не стал беспокоиться о JSON как таковом. Знаете ли вы, что порядок строк/полей всегда одинаков?

Ответ №1:

Относитесь ко всему этому так, как будто это CSV-файл с очень странными разделителями. Разделитель записей-это комбинация }{ и пробел. Разделитель вашего поля-это разрыв строки. Либо очистите окружающие скобки, либо проигнорируйте их.

Мой код не выполняет никакой проверки формата ввода, но предоставляет вам значения, необходимые для обработки в DBI.

 use strict;
use warnings;

# replace with your shell-out
my $input = do { local $/ = undef; <DATA> };


foreach my $record ( split '}', $input) {
    my ($name, $gender, $fundstatus, $updated, $status) = grep {/[^{}s]/ } split "n", $record;

    next unless $name;

    # ...
}


__DATA__
{
 {
   Dan Summers

   Male
   Funds less than $100
   March 23, 2021 1:58:24 PM
   Undisclosed
 }
 {
   Susan August

   Female
   no funds
   March 23, 2021 7:58:24 AM
   Expired
 }
}