0

我想知道如何在以下代码(简化)中避免“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

所以我们可以看到,对于第二次迭代,没有“主机”。我曾经在使用 :: (ex. InfluxDB::new()) 而不是 ->(InfluxDB->new) 调用函数 new 时看到这种行为。

4

2 回答 2

3

对我来说似乎是一个错误。您可以尝试修复它或等待作者的回复

更新:这确实是一个错误,现在已修复。更新你的InfluxDB模块。

于 2015-05-06T09:17:15.657 回答
0

我不能直接评论 InfluxDB,因为它看起来像一个处于 alpha 阶段的 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); 
于 2015-05-06T09:05:48.517 回答