Arhn - архитектура программирования

Как отсортировать файл .json на основе значения подраздела в Perl

Я использую инструмент командной строки Amazon AWS для извлечения всех запущенных экземпляров. Это создает файл .json с (измененным) следующим форматом:

{
    "Reservations": [
        {
            "OwnerId": "8172695814",
            "ReservationId": "q-9d77c34a",
            "Groups": [],
            "Instances": [
                {
                    ...
                    "LaunchTime": "2014-08-14T11:37:29.000Z",
                    "Tags": [
                        {
                            "Value": "Server 5",
                            "Key": "Name"
                        }
                    ],
                    "ProductCodes": [],
                    ...

Я хочу использовать этот вывод в качестве исходного кода для приложения, похожего на информационную панель, созданного на Perl. Моя проблема в том, что список серверов в файле .json не отсортирован так, как я хочу: я хотел бы, чтобы они были упорядочены по имени тега (значения позади тегов-значения). Таким образом, в приведенном выше примере любой сервер с 1 по 4 должен быть выше сервера 5, а все остальные ниже.

(отредактировано) Я могу перебрать значения, чтобы отобразить их на панели инструментов следующим образом:

foreach my $instance_list (@instances) {
        foreach my $instance (@$instance_list){
                if ( $$instance{'Instances'}[0]{'State'}{'Name'} !~ m/terminated/io ) {
                        if ( $$instance{'Instances'}[0]{'Tags'}[0]{'Value'} =~ m/Server.*/o ) {
                        ...

Но теперь задача состоит в том, чтобы отсортировать элементы в правильном порядке. Может ли кто-нибудь сказать мне, как это можно сделать в Perl? Спасибо!


  • Проблема в сортировке в Perl, я не могу правильно отсортировать N-й элемент 14.08.2014

Ответы:


1

Вы можете использовать собственный метод сортировки с perl: @sorted = sort { $a cmp $b } @list;

Если вы играете в этот пример:

use strict;
use Data::Dumper;

my @servers = ( 
    { name => "server1", launchtime => "2014-08-14T11:37:29.000Z" },
    { name => "server2", launchtime => "2014-08-15T11:37:29.000Z" },
    { name => "server5", launchtime => "2014-08-16T11:37:29.000Z" },
    { name => "server4", launchtime => "2014-08-17T11:37:29.000Z" },
    { name => "server3", launchtime => "2014-08-12T11:37:29.000Z" },
 );

print Dumper( \@servers);


my @default_sorted = sort @servers;

my @custom_sorted = sort {$a->{name} cmp $b->{name}} @servers;

Результат будет:

  • default_sorted => server5, 4, 3, 1, 2 (из-за вероятного времени запуска)
  • custom_sorted => сервер1, 2, 3, 4, 5
14.08.2014
  • Я нашел это, но похоже, что вы можете сортировать только на один уровень в глубину. Я хочу, чтобы он был отсортирован по {Reservations}[x]{'Instances'}[0]{'Tags'}[0]{'Value'}. 14.08.2014
  • @cootje Пока вы проходите сортировку списка, вы можете сравнивать любые ключи глубокого уровня, которые хотите. 14.08.2014

  • 2

    Что-то вроде этого, похоже, делает то, что вы хотите.

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use 5.010;
    
    my $servers = {
      Reservations => [ {
        Something => 'foo',
        Instances => [ {
          Tags => [ {
            Value => 1,
            Key   => 'Name',
          } ],
        } ],
      }, {
        Something => 'bar',
        Instances => [ {
          Tags => [ {
            Value => 0,
            Key   => 'Name',
          } ],
        } ],
      } ],
    };
    
    foreach (sort { $a->{Instances}[0]{Tags}[0]{Value} <=>
                    $b->{Instances}[0]{Tags}[0]{Value} }
                      @{$servers->{Reservations}}) {
      say $_->{Something};
    }
    

    Выводит «bar», за которым следует «foo» — это правильный порядок.

    14.08.2014

    3

    Наконец заработало. Проблема заключалась в том, что элемент Reservations был двойным, поэтому мне нужно было получить первый элемент для работы. Вот как это выглядит сейчас:

    @{$instances[0]} = sort { $a->{'Instances'}[0]{'Tags'}[0]{'Value'} cmp $b->{'Instances'}[0]{'Tags'}[0]{'Value'} } @{$instances_unsorted[0]};
    

    Спасибо за советы!

    15.08.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..