【问题标题】:Perl, @array in perl constructorPerl,@array 在 perl 构造函数中
【发布时间】:2011-11-25 22:19:42
【问题描述】:

我编写 perl 类,但我不知道如何在我的 $this 变量中包含数组或哈希?

我有一个pack.pm

#!/usr/bin/perl -w
use strict;
use Parallel::ForkManager;
package Pack;

our $cgi = new CGI;

sub new {
    my ($classe, $nom, $nbports, $gio) = @_;

    my $this = {
    "nom"    => $nom,
    "nbports" => $nbports,
    "gio"   => $gio
    };

    bless($this, $classe);
    return $this;   
}
    ...
1;

我想要一个@tab,我可以通过$this->tab 访问,但我不想将它以arg 形式提供给实例。
它在 Perl 中是如何工作的?

谢谢。

【问题讨论】:

  • 你想做什么?你想要一个@tab,它是$this 的一部分,但你没有传递给new()?是否希望将其创建为空表,以便以后用作 $this->tab?
  • @AAT :是的,我想要 $this 的 @tab 部分,并且我不传递给 new(),一个空数组,在实例化时创建。我可以通过 $this->tab 访问。谢谢

标签: perl variables constructor instance


【解决方案1】:

鉴于你对我的 cmets 的回答,我想你想要

my($this) = {
    "nom"     =>  $nom,
    "nbports" =>  $nbports,
    "gio"     =>  $gio,
    "tab"     =>  []
};

即将 $this->{tab} 设置为对新匿名数组的引用。

现在您可以随意引用它,例如

$this->{"tab"}[0] = "new value";
print "Table contains ", scalar(@{$this->{"tab"}}), "entries\n";

【讨论】:

  • 谢谢,这就是我需要的,如何访问 i 元素? print $this->{"tab"}[i] ?
  • 是否可以对哈希做同样的事情? "tab" => {} ?
  • @eouti -- 1)应该这样做,2)是的。您的 $this 本身只是对匿名哈希的引用,没有理由 this 不能反过来包含对以相同方式创建的其他哈希的引用。
  • @eouti:如何创建 perl 数据结构并参考它们,您可以阅读 here
【解决方案2】:

考虑使用Moose 来满足您的OO Perl 需求。

我已经创建了您的对象的 Moose 版本,其中包含一个具有 Array trait 委托的属性的属性,包括委托方法的柯里化。 Moose 提供了简单的方法来生成强大的封装类,而无需编写大量样板文件。

我创建了一个类Pack,其属性为:nomnbportsgiotab

nom 是只读字符串,在创建对象时是必需的。 nbports 是一个只读整数值,未提供时默认为 32。 gio 是一个可选的读写布尔值。 tab 是一个字符串数组。已经为tab 定义了各种行为:

  • all_tabs 返回tabs 的内容列表
  • add_tab 将值推送到 tabs 的末尾
  • tab_count 返回 tabs 中元素的计数
  • alpha_tabs 返回tabs 的成员列表,按字母顺序排列
  • turn_tabs 返回tabs 中的字符串列表,但字母反了

任何设置属性的尝试都需要检查类型的正确性。

Moose 使用以下代码创建了支持这些复杂行为所需的所有方法:

package Pack;
use Moose;

has 'nom' => (
   is => 'ro',
   isa => 'Str',
   required => 1,
);

has 'nbports' => (
   is      => 'ro',
   isa     => 'Int',
   default => 32,
);

has 'gio' => (
   is  => 'rw',
   isa => 'Bool',
   predicate => 'has_gio',
);

has 'tab' => (
   traits  => ['Array'],
   is      => 'ro',
   isa     => 'ArrayRef[Str]',
   default => sub {[]},
   handles => {
      all_tabs    => 'elements',
      add_tab     => 'push',
      turn_tabs   => [ 'map', sub { reverse } ],
      tab_count   => 'count',
      alpha_tabs  => [ 'sort', sub { lc($a) cmp lc($b) } ],
  },
);

__PACKAGE__->meta->make_immutable;
no Moose;
1;

可以这样使用:

 my $p = Pack->new( nom => 'Roger', tab => [qw( fee fie foe fum )] );

 my $gio_state = 'UNSET';
 if( $p->has_gio ) {
      $gio_state = $p->gio ? 'TRUE' : 'FALSE';
 }

 print  "GIO is $gio_state\n";

 my @turned = $p->turn_tabs; # eef eif eof muf
 $p->add_tabs( 'faa', 'fim' );
 my @sorted = $p->alpha_tabls; # faa fee fie fim foe fum

 my $count = $p->tab_count;  # 6

 my $ports = $p->nbports; # 32

【讨论】:

    【解决方案3】:

    尝试:

    sub set_tab {
    my ($self, @tab) = @_;
    $self->{ tab } = \@tab;
    }
    

    【讨论】:

    • 为了完整起见,我会添加perldoc perldsc
    • 还有sub get_tab { my $this = shift; return @{ $this->{tab} }; }
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多