Perl 脚本用于截断输入并在一定数量的实例后开始新行

Perl 脚本用于截断输入并在一定数量的实例后开始新行

我有一个 perl 脚本,用于将文本文件转换为 json。
该脚本如下所示:

perl -MJSON -F, -lane '
    print to_json ({
           domain => shift @F,
           emails => [map {{email =>$_}} @F]
           }, {canonical=>1})
' input1.txt' > output.json

此脚本将输出写入 JSON 格式的文件。
我想知道如何修改脚本以截断输入。
以下是示例:
输入文件包含以下内容:

example.com,[email protected],[email protected],[email protected],[email protected],....

输出 JSON 文件将是:

{"domain":"example.com",emails:[{email:"[email protected]"},{email:"[email protected]"},.....]}

点(.)表示此后还会添加其他电子邮件。

现在我想要的是,如果电子邮件超过 21,那么脚本应该在输出文件中写入新行

输入文件:

example.com,[email protected],[email protected],[email protected],[email protected],[email protected]

输出应该是:

{"domain":"example.com",emails:[{email:"[email protected]"},{email:"[email protected]"},.....,{email:[email protected]}]}
{"domain":"example.com",emails:[{email:"[email protected]"},{email:"[email protected]"},.....]}
{"domain":"nextdomain.com",emails:[{email:"[email protected]"},{email:"[email protected]"},.....]}

这个过程还在继续。

答案1

使用拼接循环删除数组的前 21 个元素:

perl -MJSON -F, -lane '
    $domain = shift @F;
    while (@f = splice @F, 0, 21) {
        print to_json ({
           domain => $domain,
           emails => [ map { { email => $_ } } @f ]
        }, { canonical => 1 });
    }
'

相关内容