Perl encode_json函数格式不正确

时间:2015-09-02 15:06:47

标签: perl

我有几个文件充满了IP地址,每行一个地址。我想将它们组合成一个JSON文件,格式如下:

["1.1.1.1","2.2.2.2","3.3.3.3"]

然后我想将其写入新文件。请查看我的代码并在两个不同阶段查看我的输出。我认为这是一个简单的问题,但我没有看到它。

#!/usr/bin/perl
#install JSON module 'sudo cpanm JSON'
use warnings;
use strict;
use JSON;

my %data;
my @FILES = glob("/home/jamie/store/inbound/threatfeeds/*_ip");

# 1. Open and load each file    
foreach my $file (@FILES) {
    local $/ = undef;
    open my $fh, '<', $file;
    $data{$file} = <$fh>;
}

foreach my $file (@FILES) {
    $data{$file} = qx(/bin/cat "$file");
}

use File::Slurp;
foreach my $file (@FILES) {
    $data{$file} = File::Slurp::slurp($file);
}

#convert hash array to JSON
#print %data;
my $json_output = encode_json \%data;
print $json_output;

代码所代表的输出与此类似:

216.243.31.254\n195.239.244.122\n103.10.133.179\n198.13.96.39\n198.13.96.59\n198.13.96.233\n104.167.119.161\n193.201.227.90\n208.67.1.21\n175.139.186.213

如果我取消注释print %data并注释掉print $json_output,我会得到一个与此类似的IP地址列表:

109.161.206.153
91.205.173.220
66.196.243.4

3 个答案:

答案 0 :(得分:1)

我怀疑你想要的是pretty_print

print to_json ( \%data, { 'pretty_print' => 1 } );

但我还可以指出 - 它对system cat非常讨厌。 Perl具有非常好的open系统调用。

特别是当你基本上做两次并在过程中破坏你的数据。

为什么 你试图将所有文件作为纯文本嵌入到json结构中?

你的意思是你或许试图用每个元素一个IP创建一个JSON数组吗?因为你正在做的事情......不会起作用。

怎么样:

#!/usr/bin/perl
#install JSON module 'sudo cpanm JSON'
use warnings;
use strict;
use JSON;
use autodie;

my @data;

foreach my $file ( glob("/home/jamie/store/inbound/threatfeeds/*_ip") ) {
    open( my $input, "<", $file );
    while (<$input>) {
        chomp;
        my ($ip_addr) = m/([\d\.]+)/;
        push( @data, $ip_addr );
    }
    close($input);
}

my $json_output = to_json( \@data, { pretty => 1 } );
print $json_output;

假设您的文件只是一个IP地址列表,这将为您提供一个&#39; ip&#39; json array&#39;看起来像&#39;:

[
    "10.1.2.3",
    "192.168.0.22",
]

答案 1 :(得分:1)

在尝试 slurp 将数据转换为单个标量时,如果需要IP地址数组,则需要创建单个字符串

这样的东西对你有用

#!/usr/bin/perl

use strict;
use warnings;

use JSON;

my %data;
my @files = glob '/home/jamie/store/inbound/threatfeeds/*_ip';

for my $file (@files) {
    open my $fh, '<', $file;
    chomp ( my @lines = <$fh> );
    $data{$file} = \@lines;
}

my $json_output = encode_json \%data;
print $json_output;


更新

好的,所以你只想要一个IP地址列表。这很容易实现

#!/usr/bin/perl

use strict;
use warnings;

use JSON;

my @files = glob '/home/jamie/store/inbound/threatfeeds/*_ip';

my @data;

for my $file (@files) {
    open my $fh, '<', $file;
    chomp ( my @lines = <$fh> );
    push @data, @lines;
}

my $json_output = encode_json \@data;
print $json_output;

答案 2 :(得分:0)

您缺少的步骤是处理线路并构建IP地址数组。

use File::Slurp;
use JSON;

my @ips;

for my $file (@FILES) {
    my @lines = read_file($file);

    for my $line (@lines) {
        chomp($line);
        next unless $line =~ /\S/;
        push(@ips, $line);
    }
}

write_file('/path/to/output.json', encode_json(\@ips));