Ошибка InfluxDB Нечетное количество параметров для new() при запуске в цикле

Я хотел бы знать, как избежать ошибки «Нечетное количество параметров для new()» в следующем коде (упрощенном). Код работает только для первой итерации.

#!/usr/bin/perl

use InfluxDB;

for (;;) {
    load1();
    sleep 5;
}

sub load1 {
    my $ix = InfluxDB->new(host => '192.168.0.93', port => 8086, username => 'root', password => 'root', database => 'test');
    ## do some stuffs ...
}

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

Я отредактировал модуль InfluxDB, чтобы распечатать переданные параметры. Вот что я обнаружил;

Для первой итерации:

    Mouse::Meta::Class::__ANON__::2=HASH(0x2359398)
    host
    192.168.0.93
    port
    8086
    username
    root
    password
    root
    database
    test_database

Для второй итерации:

    Mouse::Meta::Class::__ANON__::6=HASH(0x2359398)
    192.168.0.93
    port
    8086
    username
    root
    password
    root
    database
    test_database

Итак, как мы видим, для второй итерации «хоста» нет. Однажды я видел такое поведение при вызове функции new с помощью :: (например, InfluxDB::new()) вместо ->(InfluxDB->new).


person Myombo    schedule 06.05.2015    source источник
comment
Чтобы решить насущную проблему, вы можете переместить объявление $ix за пределы функции, чтобы оно вызывалось только один раз.   -  person AKHolland    schedule 06.05.2015
comment
Вчера попробовал, результат тот же..   -  person Myombo    schedule 06.05.2015
comment
Это действительно ошибка, и сейчас она исправлена ​​(см. Мой ответ ниже).   -  person Vadim Pushtaev    schedule 08.05.2015


Ответы (2)


Похоже на ошибку для меня. Вы можете попытаться исправить это или дождаться ответа автора.

ОБНОВЛЕНИЕ: это действительно ошибка, и она исправлено сейчас. Обновите модуль InfluxDB.

person Vadim Pushtaev    schedule 06.05.2015
comment
Ответить на проблему и зарегистрировать отчет об ошибке? Теперь это стоит +1 :) - person Sobrique; 06.05.2015
comment
@Johns, вы также можете отметить этот ответ как правильный. - person Vadim Pushtaev; 12.05.2015

Я не могу напрямую комментировать InfluxDB, так как это похоже на проект github, который находится в альфа-версии. Если там есть ошибки, то они должны быть устранены сопровождающим(и). Это сказало:

"Нечетное количество параметров" обычно используется, когда вы пытаетесь преобразовать массив в хэш.

E.g.:

use strict;
use warnings; 
my @array = qw ( a 1 b 2 c 3 4 ):
my %hash = @array;

"Нечетное количество элементов в назначении хэша"

Причина, по которой это относится к конструкторам, таким как new(), заключается в том, что при вызове:

use SomeModule;
my $thing = SomeModule -> new(); 

Разве что форма вызова неявно передает класс. Например.:

use strict;
use warnings;

package SomeModule;

sub new {
  print "New got args: @_\n";
}

package main; 
my $thing = SomeModule -> new();

Поэтому, когда вы передаете хеш для использования в конструкторе, вам сначала нужно «вытолкнуть» это имя класса. Это хороший тон, чтобы указать это в bless.

Что-то вроде этого:

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

package SomeModule;

sub new {
  print "New got args: @_\n";
  my ( $class, %options ) = @_; 
  my $self = \%options;
  bless ( $self, $class );
  return $self;
}

package main; 
my $thing = SomeModule -> new(host => '192.168.0.93', port => 8086, username => 'root', password => 'root', database => 'test');
print Dumper $thing;

Это почти так же, как при вызове метода:

$thing -> some_method($other_argument); 

Первый аргумент — это ссылка на объект, и он в основном похож на:

SomeModule::some_method($thing, $other_argument); 
person Sobrique    schedule 06.05.2015
comment
Это не относится к делу. Похоже на ошибку InfluxDB, запустите пример. - person Vadim Pushtaev; 06.05.2015
comment
Я увидел, что InfluxDB v0.9.0 сейчас находится в альфа-фазе, и решил, что это вполне может быть так, поэтому попытался предложить что-то более полезное :) - person Sobrique; 06.05.2015