将键分配给来自外部命令结果的值

Assigning keys to values from external command results

我卡住了。我 运行 来自外部工具的命令。此工具的输出格式如下:

{
 {
   Dan Summers

   Male
   Funds less than 0
   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 0   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 0
   updated: March 23, 2021 1:58:24 PM
   status: Undisclosed
 } ....

在此非常感谢您的指导。

编辑 忘了说了。外部工具没有任何匹配条件来搜索用户名或任何类似的东西。如果您 运行 工具和结果中有 10 个人,它将以第一个示例的格式打印所有 10 个人。作为仅供参考,因此无法仅提取用户为“Dan”的详细信息萨默斯”。

这就是我这样做的原因,因此我可以在工具之外构建此功能。

将整个文件视为一个带有非常奇怪的分隔符的 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 0
   March 23, 2021 1:58:24 PM
   Undisclosed
 }
 {
   Susan August

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