#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
}
}