Perl에서 (배열 대신) JSON 개체 컬렉션을 반복하는 방법은 무엇입니까?

Perl에서 (배열 대신) JSON 개체 컬렉션을 반복하는 방법은 무엇입니까?

저는 펄을 배우고 있어요. 개체가 배열에 포함되어 있으면 JSON 컬렉션을 성공적으로 반복할 수 있습니다. 그러나 객체가 배열에 없고 임의의 식별자(예: 0y7vfr1234) 가 있는 JSON 데이터를 사용하는 방법을 이해할 수 없습니다.사전에 모른다. 다음은 읽고 업데이트하고 파일에 다시 저장하려는 구조의 일부 샘플 데이터입니다.

{
    "0y7vfr1234": {
        "username": "[email protected]",
        "password": "some-random-password123",
        "uri": "ww1.example.com",
        "index": 14
    },
    "v2rbz1568": {
        "username": "[email protected]",
        "password": "some-random-password125",
        "uri": "ww3.example.com",
        "index": 29
    },
    "0zjk1156": {
        "username": "[email protected]",
        "password": "some-random-password124",
        "uri": "ww2.example.com",
        "index": 38
    }
}

이러한 개체가 모두 배열 내부에 있으면 다음과 같이 합니다.

#!/usr/bin/perl

use lib qw(..);
use JSON;
binmode STDOUT, ":utf8";
use utf8;
use strict;
use warnings;

my $filename1 = 'input.json';
my $filename2 = 'serverlist.txt';

my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename1)
    or die("Can't open \$filename1\": $!\n");
local $/;
<$json_fh>
};

open my $server_list, '<', $filename2 or die "Can't open $filename2: $!";
my @server_list = <$server_list>;
close $server_list or die "Can't close $server_list: $!";

my $json = JSON->new;
my $data = $json->decode($json_text);

my $aref = $data->{the_array_name};

for my $setting (@$aref) {
    if (length $setting->{uri}) { #no warnings
        $setting->{uri} =~ m/^ww(\d+)\.example.com/;
        my $server_number = $1;
        print "checking $server_number ... \n";
        if (grep{/$setting->{uri}/} @server_list) {
            print "server number is:  $server_number\n";
        } else {
            # 1. iterate through the sorted list
            foreach (@server_list)
            {
                $_ =~ m/^ww(\d+)\.example.com/;
                my $new_num = $1;
                # 2. find the next match in order
                if ( $new_num > $server_number ) {
                    print "Found it: new server number $new_num is greater than $server_number\n";
                    # TODO 3. check that it does not exist in $data->{the_array_name};

                    # 4. replace $setting->{uri} with new value
                    my $new_server = $_;
                    $new_server =~ s/\s+$//;
                    $setting->{uri} = $new_server;
                    last;
                }
            }
        }
    }
}

# 5. save JSON as a file to disk.
my $filename3 = 'output.json';
open my $proxy_settings, '>', $filename3 or die "Can't open $filename3: $!";
print $proxy_settings encode_json($data);
close $proxy_settings or die "Can't close $proxy_settings: $!";

이것은 내가 작성한 최초의 Perl입니다. 아직 모든 내용을 100% 이해하지는 못합니다. (예: binmode STDOUT, ":utf8";). 나는 이것이 최적과는 거리가 멀다고 확신하며 계속해서 노력할 것입니다. 내 질문은,위에 표시된 JSON 구조를 사용하려면 어떻게 수정해야 합니까?

저는 Linux에서 Perl 5 버전 30을 사용하고 있습니다.

답변1

이와 같이:

#!/usr/bin/perl
use JSON;
use utf8;
use strict; use warnings;

my $data = '{
  "0y7vfr1234": {
    "username": "[email protected]",
    "password": "some-random-password123",
    "uri": "ww1.example.com",
    "index": 14
  },
  "v2rbz1568": {
    "username": "[email protected]",
    "password": "some-random-password125",
    "uri": "ww3.example.com",
    "index": 29
  },
  "0zjk1156": {
    "username": "[email protected]",
    "password": "some-random-password124",
    "uri": "ww2.example.com",
    "index": 38
  }
}';

my $json = decode_json $data;

foreach my $key (keys %$json) {
    print "$key\n";
}

print "$json->{v2rbz1568}->{username}\n";

 산출

v2rbz1568
0y7vfr1234
0zjk1156
[email protected]

관련 정보