使用Perl编辑json

使用Perl编辑json,perl,Perl,我需要使用Perl编辑下面的配置文件。我需要检查cp是否为10000,如果是,则将custcap设置为99999 如果cp不等于10000,只需退出文件而不进行更改 我的理解是,我们可以使用Perl文件句柄打开文件,并使用JSON模块进行编辑,但我并不确定是否要编辑文件 谁能帮我编辑一下这个文件吗 { "version": "15320029", "global": { "ap": { "log": "info",

我需要使用Perl编辑下面的配置文件。我需要检查
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在你阅读之前