use*_*608 1 arrays perl constructor
我目前正在Perl中创建一个如下所示的类:
sub new{
$class = shift;
$self = {
#Member Variables
server => shift,
type => shift,
domains => shift
};
bless $self, $class;
return $self;
}
Run Code Online (Sandbox Code Playgroud)
我希望域是一个包含多个变量的数组.使用shift时,如何区分数组和正常变量?我试图像这样输入数组:
my $var = new class("server",1,(1,2,3));
my $var = new class("server",1,[1,2,3]);
Run Code Online (Sandbox Code Playgroud)
当尝试迭代数组时,这些都不起作用:
for $i ($self->{domains}){
print "$i\n";
}
Run Code Online (Sandbox Code Playgroud)
参数作为标量列表传递给函数,您的第一次调用就是
my $var = new class("server",1,1,2,3);
Run Code Online (Sandbox Code Playgroud)
哈希值需要是标量,因此您需要一个匿名数组
domains => [ LIST ];
Run Code Online (Sandbox Code Playgroud)
所以要么
shift 关闭所有单个选项,然后将其余部分复制到arrayref中
domains => [ @_ ];
Run Code Online (Sandbox Code Playgroud)或传递一个arrayref,这是一个标量,就像在你的第二次调用中一样,然后分配它
domains => shift;
Run Code Online (Sandbox Code Playgroud)在这两种情况下,$self->{domains}它都将是一个arrayref.
另一方面,首先考虑很好地分配参数
sub new {
my ($class, $server, $type, @domains) = @_;
# ...
my $self = {
# ...
domains => \@domains
};
return bless $self, $class;
}
Run Code Online (Sandbox Code Playgroud)
对于第一次调用,或
sub new {
my ($class, $server, $type, $rdomains) = @_;
my $self = {
# ...
domains => $rdomains
};
return bless $self, $class;
}
Run Code Online (Sandbox Code Playgroud)
对于第二个.由于bless返回它的第一个参数,我们可以直接return(为了简洁).
最后,使用间接对象表示法来调用构造函数.简而言之,不要 - 使用
my $object = ClassName->new( ARGS );
Run Code Online (Sandbox Code Playgroud)
请参阅上面的链接以获取官方声明和本文
请始终运行警告,因为这可以节省很多麻烦.我还强烈建议始终使用严格,因为它促进各种良好做法
# At the beginning of every program
use warnings 'all';
use strict;
Run Code Online (Sandbox Code Playgroud)