如何使用perl按顺序获取匹配

如何使用perl按顺序获取匹配,perl,Perl,我有+1000个json文件,如下所示: ({ "Companies": [ { "company": "COMPANY_1", "time": "20DAYS" }, { "company": "COMPANY_2", "time": "1DAY" }, ] }) 使用perl如何获得这样的输出: COMPANY_1:20DAYS,COMPANY_2:1DAY 我在尝试这个命令 perl -lnE '$

我有+1000个json文件,如下所示:

({
  "Companies": [
    {
      "company": "COMPANY_1",
      "time": "20DAYS"
    },
    {
      "company": "COMPANY_2",
      "time": "1DAY"
    },
  ]
})
使用perl如何获得这样的输出:

COMPANY_1:20DAYS,COMPANY_2:1DAY
我在尝试这个命令

perl -lnE '$x = (split /=/,$ARGV)[4], say "$x:", join ",", /(?<="company":")[^"]*/g,/(?<="time":")[^"]*/g' file.txt
期望输出:

COMPANY_1:20DAYS,COMPANY_2:1DAY
谢谢

单向:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use List::Util qw/pairs/;

my $str = q/"company": "COMPANY_1","time": "20DAYS","company": "COMPANY_2","time": "1DAY",/;

my @pairs = $str =~ m/"company" \s* : \s* "([^"]+)" \s* ,
                      "time" \s* : \s* "([^"]+)"/gx;
my @output;
for my $pair (pairs @pairs) {
    push @output, join(':', @$pair);
}
say join(',', @output);

如果您的原始数据实际上是JSON,那么出于某种原因,您正在从中剥离
{}
[]
。最好还是坚持使用原始数据,并使用
JSON::XS
或任何东西来解析它,而不是使用正则表达式。

既然已经存在这样的东西,为什么还要费心编写自己的JSON解析器呢

请注意,您所拥有的不是JSON—您在整个列表中有额外的paren,在列表末尾有额外的逗号—但我们可以补偿这些

perl -MJSON::XS -CS -0777ne'
   BEGIN { $j = JSON::XS->new->relaxed(1) }
   s/^\(//;  s/\)\z//;
   CORE::say
      join ",",
         map { join ":", $_->{company}, $_->{time} }
            @{ $j->decode($_)->{Companies} }
' *.json

两个我的数据几乎是但不完全是连续两个不同的人提出的问题?奇怪的但是,这一个不太容易转换成实际的JSON,这不是JSON。JSON文件中不能包含
。是的,它的JSON文件:)或者您在此处发布的内容与实际文件不匹配,或者您的文件不是JSON。是哪一个?请不要试图自己解析JSON。您可以使用现有的工具来处理它。请参阅CPAN上的JSON模块。是的,我的文件是JSON格式的,我在一个文件夹中有+1000个JSON文件,我想从我的所有JSON文件中获取所需的输出。@DavidBoe然后提供一个原始JSON文件的示例。示例输入包含
}、]
,这在JSON中也是无效的。我得到以下错误:开始失败--编译中止。@melpomene,已修复。@DavidBoe,这意味着先前的错误会阻止程序继续。您是否收到一个错误,说您没有安装JSON::XS?@ikegami再次出现相同的错误:BEGIN失败——编译中止。
perl -MJSON::XS -CS -0777ne'
   BEGIN { $j = JSON::XS->new->relaxed(1) }
   s/^\(//;  s/\)\z//;
   CORE::say
      join ",",
         map { join ":", $_->{company}, $_->{time} }
            @{ $j->decode($_)->{Companies} }
' *.json