Какой синтаксис при использовании массива как члена класса? Объявить, присваивать значение, возвращать и т.д. Ниже заготовка. Например, как это сделать в ней?
#!/usr/bin/perl -wpackage PackClass;
sub new {
my $self = [];$self->{@pack} = ("asd", "fgh");
bless($self);
return $self;
}sub setPack {
my $self = shift;
my $index = shift;
if (@_) { $self->{@pack[index]} = shift }
return $self->{@pack[index]};
}sub getPack {
my $self = shift;
return $self->{@pack};
}1;
Я бы предложил переделать так:
package PackClass;
sub new {
my $self = {};$self->{_RequiredArrayAttributeName} = \("asd", "fgh"); #ARRAYREF
$self->{_SomeOtherAttributeName} = 42;
...bless($self);
return $self;
}sub setPack {
my $self = shift;
my $index = shift;
if (@_) { @{$self->{_RequiredArrayAttributeName}}[index] = shift }
return @{$self->{_RequiredArrayAttributeName}}[index];
}sub getPack {
my $self = shift;
return @{$self->{_RequiredArrayAttributeName}};
}альтернативный вариант:
sub getPack { #ARRAYREF
my $self = shift;
return $self->{_RequiredArrayAttributeName};
}---
А то что вы привели, это чуть другое.
Ответ на это:
sub getPack {
my $self = shift;
return @{$self->{_RequiredArrayAttributeName}};
}Конкретно на строчку
return @{$self->{_RequiredArrayAttributeName}};
ругается:
Not an ARRAY reference at PackClass.pm line ...Что неправильно? Код доступен по ссылке:
Сам класс только: http://pastebin.com/xzQJCbGU
Использование класса: http://pastebin.com/e6Y7sAL6
С альтернативным вариантом - getPackAlternativeImplementation - ок.Как получить доступ к отдельным элементам массива theArray, используя значение, возвращаемое getPackAlternativeImplementation()? Например, как-то так, но правильно:
my $justPacket = new PackClass();
my @theArray = $justPacket->getPack();
print $Array[0] . "\n";
print $Array[1] . "\n";
Везде работать не с массивом, а с указателем на массив.my $justPacket = new PackClass();
my $theArrayRef = $justPacket->getPack(); #Should return ARRAYREF.
print $theArrayRef[0] . "\n";
print $theArrayRef[1] . "\n";
Спасибо, за толчок в нужном направлении. Детали нашёл тут: http://perldoc.perl.org/perlreftut.html
По мотивам http://stackoverflow.com/questions/2561451/how-do-i-use-an-a...
сделал свой вариант. Критика приветствуется.Сам класс, файл "ListContaine.pm"
#!/usr/bin/perluse strict;
use warnings;package ListContainer;
sub new {
my $class = shift;
my $self = {
sftVersion => shift,
softwareSynonyms => [@_],
};bless $self, $class;
return $self;
}sub setSynonyms {
my ( $self, @newSoftwareSynonyms ) = @_;
$self->{softwareSynonyms} = \@newSoftwareSynonyms;
}sub addSynonym {
my ( $self, $newSoftwareSynonym ) = @_;
push($self->{softwareSynonyms}, $newSoftwareSynonym);
}sub getSynonyms {
my( $self ) = @_;
return @{$self->{softwareSynonyms}} ;
}1;
Пользоваться так - файл "launcher.pl":
#!/usr/bin/perluse strict;
use warnings;use File::Basename;
use lib dirname(__FILE__);use ListContainer;
my @namesToBeInsertedInPlace = (
"sft First",
"sft Second",
);my $justPacket = new ListContainer("MajorName", "name Tenth", "name Eleventh", "name Twelfth");
$justPacket->setSynonyms(@namesToBeInsertedInPlace);
$justPacket->addSynonym("Yet Another One");my @theArray = $justPacket->getSynonyms();
print "Second element is:" . $theArray[1] . "\n";
print "Have " . ($#theArray + 1) . " members in the list:\n" ;
foreach my $singleName (@theArray) {
print ":\t" . $singleName . "\n";
}
Опечатка: ListContainer.pm