我想知道如何避免以下代码(简化)中的“奇数个参数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函数时看到过这种行为。
答案 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);