我有几个文件充满了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
答案 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));