SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Forside   Tilmelding   Postarkiv   Forum   Kalender   Søg
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] Array i klasse



Se nedenfor....

On Sun, 22 Sep 2002, Jan Eggert Kofoed wrote:

> Peter Makholm wrote:
> > Jan Eggert Kofoed <sslug@sslug> writes:
> > 
> > Jeg ville nok give mulighed for at initialiserer objektet i din
> > new-funktion.
> Jeg er ved at parse en XML fil, og udfylder objektet efterhånden som jeg 
> kommer til de relevante tags.
> 
> > 
> > 
> >>sub new
> >>{
> >>     my $self = shift;
> > 
> > 
> > Bemærk at $self bliver sat til navnet på klassen. Kald den $class i
> > stedet.
> > 
> > 
> >>     my @_Groups;
> >>     my $r_Album =
> > 
> > 
> > Rent stilistisk ville jeg nok kalde $r_Album for $this eller
> > $self. Det er selve objektet du opretter her som du i alle de andre
> > metoder kalder $this eller $self.
> > 
> > Hvorvidt man bruger $this eller $self er underordnet, man bør bare
> > være konsistent.
> > 
> Thanx, det er jo rigtigt.
> 
> > 
> >>     {
> >>	"_name"        => undef,
> >>	"_id"          => undef,
> >>	"_dbname"      => undef,
> >>	"_released"    => undef,
> >>	"_albumartist" => undef,
> >>	"_groups"      => sslug@sslug
> >>     };
> > 
> > 
> > Jeg ville nok skrive 'groups => []'. Der er ikke nogen grund til at
> > introducerer navnet @_Groups som du alligevel ikke kan bruge senere.
> > 
> Anvendes nu; det er meget pænere.
> 
> > 
> >>     bless $r_Album, 'Album';
> > 
> > 
> > og så endelig 'bless $slef, $class' som andre også foreslår.
> > 
> Yes!
> 
> > 
> >>     return $r_Album;
> >>} # constructor
> > 
> > 
> > Rent stilistisk plejer jeg ikke at skrive den sidste
> > return-sætning. Perl returnerer automatisk resultatet af den sidste
> > sætning.
> > 
> > Det er et smagsspørgsmål om man kan lide det eller ej. Der er nogle
> > der insisterer meget fast på at alle funktioner skalafsluttes med
> > return.
> > 
> Man kan ikke diskutere smag, men jeg synes også, at subroutinens sidste 
> udtryk er OK som returværdi.
> 
> > 
> >>sub albumartist
> >>{
> > 
> > 
> > Jeg fatter stadigvæk ikke hvad pointen med denne funktion er.
> > 
> Den lægger den første gruppe på albummet ind i $class->{groups}->[0].
> I $class->{groups}->[$t] lægges gruppen, der udfører nummeret på track 
> $t på albummet.
> 
> > 
> >>Jeg benyttede en notation fra en bog, hvor det anvendes som en
> >>konvention, der viser, at vi har med private data at gøre.
> >>Men er alle klassens data ikke det?
> > 
> > 
> > Jo. Det er også privat hvorvidt du implementerer dit objekt som en
> > arrayref eller en scalarref.
> > 
> > 
> >>Jeg har set eksempler, hvor der anvendes lutter store bogstaver, og
> >>der er også kommentarer om anvendelse af blanding af store og små
> >>bogstaver i forhold til konventioner i Perl's egen kode.
> > 
> > 
> > 'perldoc perlstyle' giver en række stilistiske råd. Den skriver ikke
> > decideret noget om objekter, men skriver som noget af det sidste om
> > store og små bogstaver.
> > 
> Fint, den læser jeg nu.
> 
> Må jeg lige igen spørge til, hvordan jeg kan bestemme størrelsen af 
> arrayet $class->{groups}.
>

Der er forskellige måder at gøre det på. Du kan "tvinge" en array variabel 
i scalar context ved at bruge scalar:

  $antal_elementer = scalar @{ $class->{groups} }

eller regne indekset til sidste element i array'et ud på følgende måde:

  $sidste_indeks = $#{ $class->{groups} }

Hvis $class->{groups} er tom, returnerer ovenstående -1.
 
> Jeg har prøvet at indsætte en stump kode for at benytte en simpel 
> reference til et array, hvor jeg kan, det jeg vil, men jeg kan ikke 
> oversætte det til objekt-notationen.
> ------------------------------------
> Album.pm
> --------
> sub new
> {
>      my $class = shift;
> 
>      my $this =
>      {
> 	"name"        => undef,
> 	"id"          => undef,
> 	"dbname"      => undef,
> 	"released"    => undef,
> 	"groups"      => []
>      };
> 
>      bless $this, $class;
> } # constructor
> 
> mymusic.pl
> ----------
>      my @anArray;
>      my $rArray = sslug@sslug;
>      $anArray[4] = 3;
> 
>      print FH "element four of rArray: ".$$rArray[4]."\n";
>      print FH "element zero of groups: " 
> .$album->{groups}->[0]->name()."\n";
>      print FH "size of rArray: ".scalar(@$rArray)."\n";
>      print FH "size of groups: ".scalar($album->{groups})."\n";

Her har vi balladen: Du glemmer at dereferere $album->{groups} som vist i 
min kommentar ovenfor.

> 
> FH
> --
> element four of rArray: 3
> element zero of groups: Canned Heat
> size of rArray: 5
> size of groups: ARRAY(0xbf655c)
> ------------------------------------
> 
> Når jeg skal udskrive et element i et array ved anvendelse af referencen 
> skal jeg jo skrive '$$', og når jeg skal benytte referencen som et array 
> (i scalar), skal jeg skrive '@$'.
> Jeg kan ikke på samme måde skifte første '$' ud med '@', når jeg 
> arbejder med objektet.
> Hvordan får jeg størrelsen på arrayet $class->{groups}?
> 
> mvh
> Jan
> 
> 

-- 
-------------------------------------------
Cand.scient. Anders Sønderberg Mortensen
Dronning Olgas Vej 55A, st.tv.
DK-2000 Frederiksberg
DENMARK

Phone: + 45 38 86 57 20
-------------------------------------------




 
Forside   Tilmelding   Postarkiv   Oversigt   Kalender   Søg

 
 
Henvendelse vedrørende websiderne til <www_admin>. Senest ændret 2005-08-10, klokken 19:54
Denne side vedligeholdes af MHonArc .