2015-05-06 2 views
0

Я хотел бы знать, как избежать ошибки «Нечетное число параметров для новой()» по следующему коду (упрощенный). Код работает только для первой итерации.«SOLVED» - ошибка InfluxDB «Нечетное число параметров для 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).

+0

Чтобы решить ближайшую проблему, вы можете переместить декларацию '$ ix' за пределы функции, чтобы она вызывалась только один раз. – AKHolland

+0

Я пробовал это вчера, и у меня получился тот же результат. – Myombo

+0

Это ошибка, и теперь она исправлена ​​(см. Мой ответ ниже). –

ответ

0

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

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

Например:

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); 
+0

Это не тот случай. Он выглядит как ошибка InfluxDB, запустите пример. –

+0

Я видел, что «InfluxDB v0.9.0 теперь находится в альфа-фазе» и решил, что это может быть так - поэтому попытался предложить что-то более полезное :) – Sobrique

3

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

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

+0

Отвечая на проблему и протоколируя отчет об ошибке? Теперь это стоит +1 :) – Sobrique

+0

Спасибо большое, он работает. – Myombo

+0

@Johns, вы также можете отметить этот ответ как правильный. –