我目前正在Perl中创建一个如下所示的类:
sub new{
$class = shift;
$self = {
#Member Variables
server => shift,
type => shift,
domains => shift
};
bless $self, $class;
return $self;
}
我希望域是一个包含多个变量的数组。使用shift时,如何区分数组和正常变量?我试图像这样输入数组:
my $var = new class("server",1,(1,2,3));
my $var = new class("server",1,[1,2,3]);
当尝试迭代数组时,这些都不起作用:
for $i ($self->{domains}){
print "$i\n";
}
答案 0 :(得分:5)
参数作为标量列表传递给函数,第一次调用只是
my $var = new class("server",1,1,2,3);
哈希值需要是标量,因此您需要一个匿名数组
domains => [ LIST ];
所以要么
shift
关闭所有单个选项,然后将其余选项复制到arrayref
domains => [ @_ ];
或传递一个arrayref,这是一个标量,就像在你的第二次调用中一样,然后分配它
domains => shift;
在这两种情况下,$self->{domains}
都将是一个arrayref。
另一方面,首先考虑很好地分配参数
sub new {
my ($class, $server, $type, @domains) = @_;
# ...
my $self = {
# ...
domains => \@domains
};
return bless $self, $class;
}
用于第一次调用,或
sub new {
my ($class, $server, $type, $rdomains) = @_;
my $self = {
# ...
domains => $rdomains
};
return bless $self, $class;
}
表示第二个。由于bless返回其第一个参数,我们可以直接return
(为了简洁起见)。
最后,使用indirect object notation来调用构造函数。简而言之,不要 - 使用
my $object = ClassName->new( ARGS );
请参阅上面的链接以获取正式声明,并this post
请始终与warnings一起运行,因为这样可以省去很多麻烦。我还强烈建议始终使用strict,因为它会促进各种良好做法
# At the beginning of every program
use warnings 'all';
use strict;
答案 1 :(得分:3)
如果要将域指定为列表,则需要执行以下操作:
sub new {
$class = shift;
$self = {
server => shift,
type => shift,
domains => [ @_ ],
};
bless $self, $class;
return $self;
}
这是因为哈希不能有非标量键或值。
无论哪种方式,在迭代域时你都必须取消引用数组引用:
for my $domain (@{ $self->{domains} }){
print "$domain\n";
}