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

时间:2017-05-12 17:40:59

标签: arrays perl constructor

我目前正在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";
 }

2 个答案:

答案 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";
 }