使用Perl编辑json
我需要使用Perl编辑下面的配置文件。我需要检查使用Perl编辑json,perl,Perl,我需要使用Perl编辑下面的配置文件。我需要检查cp是否为10000,如果是,则将custcap设置为99999 如果cp不等于10000,只需退出文件而不进行更改 我的理解是,我们可以使用Perl文件句柄打开文件,并使用JSON模块进行编辑,但我并不确定是否要编辑文件 谁能帮我编辑一下这个文件吗 { "version": "15320029", "global": { "ap": { "log": "info",
cp
是否为10000,如果是,则将custcap
设置为99999
如果cp
不等于10000,只需退出文件而不进行更改
我的理解是,我们可以使用Perl文件句柄打开文件,并使用JSON模块进行编辑,但我并不确定是否要编辑文件
谁能帮我编辑一下这个文件吗
{
"version": "15320029",
"global": {
"ap": {
"log": "info",
"hyd": {
"log": "info",
"qo": false
}
},
"cus": [
{
**"cp": "10000"**,
"ser": "XYZ",
"usesr": false,
"services": {
"acc": {
"ips": {
"usesr": false
}
}
},
"q": {
"policy": "CAP",
**"custcap": 3000000**
}
},
{
"cp": "10441",
"ser": "abc",
"usesr": false,
"services": {
"acc": {
"ips": {
"usesr": false
}
}
},
"q": {
"policy": "CAP",
"custcap": 3000000
}
}
]
}
代码段:
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
open my $fh, "<", "data.json";
my $json = <$fh>;
close $fh;
my $data = decode_json($json);
$data->{'q'}->{'custcap'}->[1] = "9999";
open my $fh, ">", "data.json";
print $fh encode_json($data);
close $fh;
#/usr/bin/perl
严格使用;
使用警告;
使用JSON;
打开我的$fh,“,”data.json“;
打印$fh encode_json($data);
收盘价$fh;
问题1:您刚刚读取了文件的第一行
一次读取整个文件的一个技巧是使用local$/
。通过一些错误检查和范围界定,这将如下所示:
my $qfn = 'data.json';
my $json;
{
open(my $fh, "<", $qfn)
or die("Can't open file \"$qfn\": $!\n");
local $/;
$json = <$fh>;
}
问题1:您刚刚读取了文件的第一行
一次读取整个文件的一个技巧是使用local$/
。通过一些错误检查和范围界定,这将如下所示:
my $qfn = 'data.json';
my $json;
{
open(my $fh, "<", $qfn)
or die("Can't open file \"$qfn\": $!\n");
local $/;
$json = <$fh>;
}
问题1:您刚刚读取了文件的第一行
一次读取整个文件的一个技巧是使用local$/
。通过一些错误检查和范围界定,这将如下所示:
my $qfn = 'data.json';
my $json;
{
open(my $fh, "<", $qfn)
or die("Can't open file \"$qfn\": $!\n");
local $/;
$json = <$fh>;
}
问题1:您刚刚读取了文件的第一行
一次读取整个文件的一个技巧是使用local$/
。通过一些错误检查和范围界定,这将如下所示:
my $qfn = 'data.json';
my $json;
{
open(my $fh, "<", $qfn)
or die("Can't open file \"$qfn\": $!\n");
local $/;
$json = <$fh>;
}
@kjpires认为发布的代码段不会加载整个文件,并且不会正确解析它是正确的 这只是解决方案的一半。发布的代码段错误地遍历了JSON结构 根节点有一个
global
节点,该节点有一个作为数组的cus
节点,每个cus
节点可以有一个q
节点,该节点具有custcap
属性。您的代码片段省略了cus
数组,并尝试直接访问q
如果custcap
多次出现,您的要求并不明确。假设您需要更新每次出现的custcap
,如果其当前值为10000和99999,则需要替换
$data->{'q'}->{'custcap'}->[1]=“9999”代码>
比如说:
for my $customer (@{$data->{global}{cus}}) {
$customer->{q}{custcap} = 99999 if ($customer->{cp} == 10000);
}
@kjpires认为发布的代码段不会加载整个文件,并且不会正确解析它是正确的
这只是解决方案的一半。发布的代码段错误地遍历了JSON结构
根节点有一个global
节点,该节点有一个作为数组的cus
节点,每个cus
节点可以有一个q
节点,该节点具有custcap
属性。您的代码片段省略了cus
数组,并尝试直接访问q
如果custcap
多次出现,您的要求并不明确。假设您需要更新每次出现的custcap
,如果其当前值为10000和99999,则需要替换
$data->{'q'}->{'custcap'}->[1]=“9999”代码>
比如说:
for my $customer (@{$data->{global}{cus}}) {
$customer->{q}{custcap} = 99999 if ($customer->{cp} == 10000);
}
@kjpires认为发布的代码段不会加载整个文件,并且不会正确解析它是正确的
这只是解决方案的一半。发布的代码段错误地遍历了JSON结构
根节点有一个global
节点,该节点有一个作为数组的cus
节点,每个cus
节点可以有一个q
节点,该节点具有custcap
属性。您的代码片段省略了cus
数组,并尝试直接访问q
如果custcap
多次出现,您的要求并不明确。假设您需要更新每次出现的custcap
,如果其当前值为10000和99999,则需要替换
$data->{'q'}->{'custcap'}->[1]=“9999”代码>
比如说:
for my $customer (@{$data->{global}{cus}}) {
$customer->{q}{custcap} = 99999 if ($customer->{cp} == 10000);
}
@kjpires认为发布的代码段不会加载整个文件,并且不会正确解析它是正确的
这只是解决方案的一半。发布的代码段错误地遍历了JSON结构
根节点有一个global
节点,该节点有一个作为数组的cus
节点,每个cus
节点可以有一个q
节点,该节点具有custcap
属性。您的代码片段省略了cus
数组,并尝试直接访问q
如果custcap
多次出现,您的要求并不明确。假设您需要更新每次出现的custcap
,如果其当前值为10000和99999,则需要替换
$data->{'q'}->{'custcap'}->[1]=“9999”代码>
比如说:
for my $customer (@{$data->{global}{cus}}) {
$customer->{q}{custcap} = 99999 if ($customer->{cp} == 10000);
}
一个问题是my$json=
不会读取整个文件:您只需要获取文件的一行(然后只解析这一行,除非它都在一行上,否则可能会失败)
一种快速解决方案是使用以下命令取消定义输入行结束符:$/=undef代码>在读取文件之前。另一个解决方案是使用模块。一个问题是my$json=
不会读取整个文件:您只需要获取文件的一行(然后只解析这一行,除非它都在一行上,否则可能会失败)
一种快速解决方案是使用以下命令取消定义输入行结束符:$/=undef代码>在读取文件之前。另一个解决方案是使用模块。一个问题是my$json=
不会读取整个文件:您只需要获取文件的一行(然后只解析这一行,除非它都在一行上,否则可能会失败)
一种快速解决方案是使用以下命令取消定义输入行结束符:$/=undef代码>在你阅读之前