2016-05-02 3 views
0

с использованием данных: самосвал, выход XML показан ниже.perm массив дампера чтения

$VAR1 = { 
      'af' => { 
        'minimum' => { 
           'requested_bytes' => '8208' 
          }, 
        'time' => [ 
          { 
           'lastthreadtid' => '0x0000000030001100', 
           'exclusiveaccessms' => '0.017', 
           'meanexclusiveaccessms' => '0.017', 
           'threads' => '0' 
          }, 
          { 
           'totalms' => '41.829' 
          } 
          ], 
        'tenured' => [ 
           { 
           'loa' => { 
              'freebytes' => '1314816', 
              'totalbytes' => '1314816', 
              'percent' => '100' 
             }, 
           'freebytes' => '1314816', 
           'totalbytes' => '69219328', 
           'percent' => '1', 
           'soa' => { 
              'freebytes' => '0', 
              'totalbytes' => '67904512', 
              'percent' => '0' 
             } 
           }, 
           { 
           'loa' => { 
              'freebytes' => '628664', 
              'totalbytes' => '685056', 
              'percent' => '91' 
             }, 
           'freebytes' => '41796952', 
           'totalbytes' => '68537344', 
           'percent' => '60', 
           'soa' => { 
              'freebytes' => '41168288', 
              'totalbytes' => '67852288', 
              'percent' => '60' 
             } 
           } 
          ], 
        'timestamp' => 'May 01 20:33:51 2016', 
        'intervalms' => '681.342', 
        'refs' => [ 
          { 
           'weak' => '19116', 
           'maxSoftReferenceThreshold' => '32', 
           'phantom' => '0', 
           'dynamicSoftReferenceThreshold' => '20', 
           'soft' => '1709' 
          }, 
          { 
           'weak' => '18490', 
           'maxSoftReferenceThreshold' => '32', 
           'phantom' => '0', 
           'dynamicSoftReferenceThreshold' => '19', 
           'soft' => '1709' 
          } 
          ], 
        'gc' => { 
          'classunloading' => { 
               'classes' => '0', 
               'timevmquiescems' => '0.000', 
               'timetakenms' => '1.418', 
               'classloaders' => '0' 
              }, 
          'finalization' => { 
              'objectsqueued' => '8' 
              }, 
          'timesms' => { 
             'compact' => '0.000', 
             'mark' => '39.600', 
             'sweep' => '0.495', 
             'total' => '41.787' 
            }, 
          'tenured' => { 
             'loa' => { 
               'freebytes' => '628664', 
               'totalbytes' => '685056', 
               'percent' => '91' 
               }, 
             'freebytes' => '41805160', 
             'totalbytes' => '68537344', 
             'percent' => '60', 
             'soa' => { 
               'freebytes' => '41176496', 
               'totalbytes' => '67852288', 
               'percent' => '60' 
               } 
            }, 
          'intervalms' => '681.373', 
          'type' => 'global', 
          'id' => '24', 
          'totalid' => '24', 
          'contraction' => { 
              'timetaken' => '0.000', 
              'amount' => '681984', 
              'newsize' => '68537344', 
              'reason' => 'excess free space following gc', 
              'type' => 'tenured' 
             } 
         }, 
        'type' => 'tenured', 
        'id' => '24', 
        'pending-finalizers' => [ 
              { 
              'reference' => '0', 
              'finalizable' => '8', 
              'classloader' => '0' 
              }, 
              { 
              'reference' => '0', 
              'finalizable' => '8', 
              'classloader' => '0' 
              } 
             ] 
       } 
     }; 

в perl-коде, записывая нижеследующую команду.

 print Dumper($dataXML); 
     print $dataXML->{af}->{type}.","; 
     print $dataXML->{af}->{id}.","; 
     print $dataXML->{af}->{timestamp}.","; 
     print $dataXML->{af}->{intervalms}.","; 
     print $dataXML->{af}->{minimum}->{requested_bytes}.","; 
     print $dataXML->{af}->{time}[1]->{totalms}.","; 

     print $dataXML->{af}->{tenured}[1]->{freebytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{totalbytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{percent}.","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[1]->{freebytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[1]->{totalbytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[1]->{percent}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[1]->{freebytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[1]->{totalbytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[1]->{percent}.","; 
     print $dataXML->{af}->{tenured}[1]->{freebytes}[2].","; 
     print $dataXML->{af}->{tenured}[1]->{totalbytes}[2].","; 
     print $dataXML->{af}->{tenured}[1]->{percent}[2].","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[2]->{freebytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[2]->{totalbytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{loa}[2]->{percent}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[2]->{freebytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[2]->{totalbytes}.","; 
     print $dataXML->{af}->{tenured}[1]->{soa}[2]->{percent}.","; 

Ошибка:

Not an ARRAY reference 

Я попытался несколько способов, чтобы получить значение каждого массива ключ-значение, но он показывает только последнее значение.

+0

Проверьте самосвал и найдите '' 'для идентификации массивов. –

+0

все места, в которых у вас есть '[1]' дважды в одной строке или '[1]', за которым следует '[2]', второе разыменование массива - это нечто, что не является массивом ref; для loa и soa, это есть ссылка, для остальных ключей это число. – ysth

+0

также, я подозреваю, что у вас есть '{time} [1]' you mean '{time} [0]'. и, вероятно, вы имеете в виду первый набор строк для того, чтобы иметь '{tenured} [0]', а следующий набор '{tenured} [1]' – ysth

ответ

1

О вашем вопросе: номер исходной строки, где возникла некоторая ошибка, всегда хорошо знать, поскольку это помогает в решении. Для цитируемого кода полезно указать, какая строка вызвала ошибку.

Perl знает два основных типа ссылок: массив и хэш.

Массивы - это упорядоченный список предметов. На каждый элемент ссылается уникальный последовательный номер. Элементы могут быть добавлены, добавлены, удалены или заменены в начале, в конце или в любой другой позиции. (См. unshift, push, shift, pop, splice - все они являются ссылочными ссылками). Массивы обычно используют [ ]: $array[0] адресует первый элемент и ->[ ] разделяет ссылку на массив.

Хеши являются ключевыми/ценными: каждый элемент имеет ключ и значение, в котором оба могут содержать любой символ и могут иметь любой размер. Элементы неупорядочены и - потому что нет порядка - не могут быть добавлены или добавлены. Их можно заменить назначением нового значения существующему ключу или удалением с помощью delete. { } используется для доступа к хеш-элементам и ->{ } для ссылок на разыменования.

Ваш код смешивания двух стилей разыменования:

print $dataXML->{af}->{time}[1]->{totalms}.","; 

Лучше написать:

print $dataXML->{af}->{time}->[1]->{totalms}.","; 

(Добавлен -> между временем и [1].) То же для всех прослеживания вхождений {hashref}[array_index]. Всегда использование -> более очевидно для читателя.

Ваша ошибка впервые появляется в этой строке:

print $dataXML->{af}->{tenured}->[1]->{loa}->[1]->{freebytes}.","; 

Как и другие уже изложены в комментариях к вашему вопросу: Значение ключа {loa} не ссылка на массив, но ссылка хэш. Вот почему вы не можете разыменовать (= доступ к ссылочной структуре данных), используя ->[ ]. Но удаление, что дополнительная ссылка на массив также удаляет ошибку:

print $dataXML->{af}->{tenured}->[1]->{loa}->{freebytes}.","; 

Подробнее о ссылках на http://perldoc.perl.org/perlref.html

PS: Вы всегда обращались второй элемент массивов в пределах ваших структур данных. Это может быть то, что вы хотите, но в остальном помните, что массивы Perl обычно основаны на нулевом значении: первый элемент - [0].

Смежные вопросы