InfluxDB错误“在循环上运行时,奇数参数new()”

时间:2015-05-06 07:24:29

标签: perl 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 ...
}

我试图对此进行研究,但我找不到使用shift或bless函数来解决这个问题的方法。

我编辑了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

正如我们所看到的,对于第二次迭代,没有“主机”。我曾经用::(例如Influs.DBs :: new())而不是 - >(InfluxDB-> new)调用new函数时看到过这种行为。

2 个答案:

答案 0 :(得分:3)

对我来说看起来像个错误。您可以尝试修复它或等待author's response

更新:这确实是一个错误,现在是fixed。更新您的InfluxDB模块。

答案 1 :(得分:0)

我不能直接评论InfluxDB,因为它看起来像是一个alpha版的github项目。如果那里有bug,那么它就是维护者要解决的问题。那说:

当您尝试将数组转换为哈希时,“奇数个参数”通常是

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(); 

这种形式的调用是否隐含地传递了类。 E.g:

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