Perl, @array в конструкторе Perl - PullRequest
5 голосов
/ 16 мая 2011

Я пишу классы 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, но я не хочу давать его варгумент к экземпляру.
Как это работает в Perl?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 16 мая 2011

Учитывая ваш ответ на мои комментарии, я думаю, что вы хотите

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

т.е. установите $ this -> {tab} в качестве ссылки на новый анонимный массив.

Теперь вы можете ссылаться на него, как хотите, например,

$this->{"tab"}[0] = "new value";
print "Table contains ", scalar(@{$this->{"tab"}}), "entries\n";
3 голосов
/ 17 мая 2011

Рассмотрите возможность использования Moose для ваших нужд OO Perl.

Я создал версию вашего объекта Moose, которая включает атрибут с атрибутом, включающим делегирование черты Array, включая каррирование делегированных методов. Moose предлагает простые способы создания мощных, инкапсулированных классов без написания множества шаблонов.

Я создал класс Pack с атрибутами: nom, nbports, gio и tab.

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
2 голосов
/ 16 мая 2011

попробуйте с:

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