在构造函数中输入数组 - Perl

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)

zdi*_*dim 5

参数作为标量列表传递给函数,您的第一次调用就是

my $var = new class("server",1,1,2,3);
Run Code Online (Sandbox Code Playgroud)

哈希值需要是标量,因此您需要一个匿名数组

domains => [ LIST ];
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)