Использование неинициализированного значения в конкатенации (.) или строки в плагине slapd_munin

Я пытаюсь реализовать плагин slapd_ munin, написанный на Perl, о котором я почти ничего не знаю. Полный плагин доступен здесь. Ошибка, которую я получаю, такова:

Use of uninitialized value in concatenation (.) or string at
/etc/munin/plugins/slapd_localhost line 232, <DATA> line 275.

Строка 232 это:

 my $searchdn = $ops{$action}->{'search'} . "," . $basedn;

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

use Data::Dumper;   # top of script
# [...]
print Dumper(%ops);
print "action = [$action]\n";
print "basedn = [$basedn]\n\n";
my $searchdn = $ops{$action}->{'search'} . "," . $basedn;

Когда я запускаю его снова, вот что я получаю:

[...] # 15 other variables belonging to $ops
$VAR16 = {
           'info' => 'The graph shows the number of Waiters',
           'search' => 'cn=Waiters',
           'desc' => 'The current number of Waiters',
           'filter' => '(|(cn=Write)(cn=Read))',
           'title' => 'Number of Waiters',
           'label2' => {
                         'read' => 'Read',
                         'write' => 'Write'
                       },
           'vlabel' => 'Waiters'
         };
action = [localhost]
action = [cn=Monitor]

Use of uninitialized value in concatenation (.) or string at /etc/munin/plugins/slapd_localhost line 237, <DATA> line 275.

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

В: Кто-нибудь может посоветовать, как отлаживать этот скрипт?


person Max    schedule 18.11.2011    source источник
comment
Вы уверены, что $basedn было присвоено значение?   -  person canavanin    schedule 18.11.2011


Ответы (1)


Вы должны сбросить ссылку на %ops, как в

print Dumper \%ops;

Это сделает вывод отладки более ясным. Для иллюстрации рассмотрим вывод

#! /usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %h = (foo => { bar => 1 }, baz => { quux => 3 });

print "No reference:\n",
      Dumper(%h),
      "\n",
      "Reference:\n",
      Dumper(\%h);

Обратите внимание, как вы видите структуру гораздо более четко во второй половине:

No reference:
$VAR1 = 'baz';
$VAR2 = {
          'quux' => 3
        };
$VAR3 = 'foo';
$VAR4 = {
          'bar' => 1
        };

Reference:
$VAR1 = {
          'baz' => {
                     'quux' => 3
                   },
          'foo' => {
                     'bar' => 1
                   }
        };

Вы вырезаете критический бит вывода. Каково значение $VAR15? Это "localhost" или что-то другое?

Когда вы печатаете $searchdn, каково его значение?

person Greg Bacon    schedule 18.11.2011
comment
печать со ссылкой действительно помогла. Стало ясно, что массив $ops на самом деле содержит конфигурацию плагина и что я неправильно создал символическую ссылку плагина (в мире munin вы используете саму символическую ссылку для передачи аргументов вашему плагину), поэтому он не работает. - person Max; 23.11.2011