Добавить индекс и значение в массив в Perl

Я новичок в мире Perl и надеюсь получить вашу помощь здесь.

скажем, у меня есть следующий массив:

trap:  $VAR1 = [
      {
        'oid' => 'enterprises.12356.101.2.0.504',
        'type' => 'IPS Anomaly'
      }
    ];

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

trap:  $VAR1 = [
      {
        'oid' => 'enterprises.12356.101.2.0.504',
        'type' => 'IPS Anomaly',
        'attackid' => 'ID',
        'detail' => 'Some details',
        'url' => 'http://....'
      }
    ];

Таким образом, элементы не добавляются в конец массива - что делается с помощью push или unshift - я пробовал сращивать, но это не работает.


person matrix154    schedule 03.07.2013    source источник
comment
Не могли бы вы показать нам код, который вы сделали?   -  person Toto    schedule 03.07.2013


Ответы (3)


Вы можете сделать что-то, как показано ниже, и предполагая, что вам все равно, что один хэш перезаписывает ключи и значения из другого, вы можете просто использовать фрагмент хэша, чтобы добавить один хеш к другому, поскольку это ссылка на массив, содержащий хэш.

use strict;
use Data::Dumper;
use warnings;

my $arr_ref = [ { 'oid' => 'enterprises.12356.101.2.0.504', 'type' => 'IPS Anomaly' } ];
my %test = ('attackid' => 'ID', 'detail' => 'Some details') ;

@{$arr_ref->[0]}{ keys %test } = values %test;
print Dumper($arr_ref);

Выход:

$VAR1 = [
          {
            'detail' => 'Some details',
            'attackid' => 'ID',
            'oid' => 'enterprises.12356.101.2.0.504',
            'type' => 'IPS Anomaly'
          }
        ];
person Nikhil Jain    schedule 03.07.2013

Вы не добавляете в массив, вы добавляете пары ключ/значение в хэш внутри массива. Вы можете увидеть это по скобкам, используемым в выводе Data::Dumper

$VAR1 = [     # <-- this means start of anonymous array ref
          {   # <-- this means start of anonymous hash ref

Итак, в основном у вас есть массив хэшей. Например. $VAR->[0]{'key'} - это синтаксис, который вы бы использовали.

Вы должны знать, что полученная структура — это только половина картины. Что более важно в этом случае, так это код, который вы использовали, чтобы туда попасть, так что это то, что вы должны показать.

Кроме того, вы должны знать, что у хеша нет «начала» и «конца»: хэш неупорядочен, и нет возможности контролировать порядок ключей/значений. (Обычными средствами)

person TLP    schedule 03.07.2013

Это ссылка на массив, содержащая одну ссылку на хэш. Вы можете добавить значения в хэш, используя:

$arrayref->[0]->{'detail'} = 'Some details';
$arrayref->[0]->{'url'} = 'http://....';

Пояснение:

Чтобы получить доступ к элементам массива по его ссылке, вы используете функцию ->. например $arrayref->[0] дает вам первый элемент. Этот первый элемент является ссылкой на хеш, поэтому вы снова используете -> для доступа к его элементам.

person RobEarl    schedule 03.07.2013