Schrift
[thread]7627[/thread]

arrays in objects



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
docsnyder
 2006-01-17 11:14
#61973 #61973
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo!

Ich möchte ein Objekt erzeugen, das ein Array als Attribut besitzt.

Wie mache ich sowas, denn so geht's wohl nicht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub new {
my($package) = shift;
my(@arr) = shift;
my($self) = {};

bless($self, $package);

$self->{array} = @arr;

return($self);
}


Any ideas?

Gruß, doc
pq
 2006-01-17 11:45
#61974 #61974
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
sub new {
 my ($class, @array) = @_;
 my $self = { array => \@array };
 bless $self, $class;
}

du kannst aber auch prima $self als ein array-objekt anlegen, wenn
du lust hast.\n\n

<!--EDIT|pq|1137491160-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2006-01-17 11:56
#61975 #61975
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, benutze Referenzen. Werte von Hashs koennen nur Skalare sein. Es hilft Dir wahrscheinlich perlreftut weiter...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
docsnyder
 2006-01-17 12:12
#61976 #61976
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke pq, das ist genau was ich brauche ;o)

Nochmal zum Verständnis: warum ist

Code: (dl )
my $self = { childs => \@array };


was anderes als

Code: (dl )
my $self=>{array} = \@array;


???

Letzteres funktioniert nicht :o(

Gruß, doc
renee
 2006-01-17 12:26
#61977 #61977
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
letzteres muss
Code: (dl )
$self->{array} = \@array;
heissen. Beim ersten ist es Variablendeklaration und -initialisierung in einem. $self "gab es vorher nicht". Beim zweiten ist $self bekannt und man fuegt der Hashreferenz nur etwas hinzu (Deswegen auch kein my mehr)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Relais
 2006-01-17 12:29
#61978 #61978
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=docsnyder,17.01.2006, 11:12]
Code: (dl )
my $self=>{array} = \@array;


Letzteres funktioniert nicht :o([/quote]

Oh doch, es gibt Dir folgenden Error:
Code: (dl )
1
2
Can't modify single ref constructor in scalar assignment at - line 1, near "@array;"
Execution aborted due to compilation errors.


Probier es doch mit dem dereferenzier-Pfeilchen anstelle eines fetten Kommas und ohne erneute my-Deklaration:
$self->{array} = \@array;

Vermutlich ist dies noch eher das gewünschte, wenn Du eine Kopie des Arrays haben willst:
$self->{array} = [ @array ];
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Taulmarill
 2006-01-17 15:25
#61979 #61979
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
man kann übrigens auch einfach einen arrayref anstatt eines hashref blessen.
Code: (dl )
1
2
3
4
5
sub new {
my ($class, @array) = @_;
my $self = [ @array ];
bless $self, $class;
}
\n\n

<!--EDIT|Taulmarill|1137504345-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2006-01-17 16:09
#61980 #61980
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=docsnyder,17.01.2006, 11:12]was anderes als

Code: (dl )
my $self=>{array} = \@array;
[/quote]
=> entspricht in etwa einem komma, d.h. deine zeile entspricht
Code: (dl )
my $self, {'array'} = \@array;

was wenig sinn macht

du hast mehrere moeglichkeiten, dies zu schreiben:
Code: (dl )
1
2
3
4
my $self = { array => \@array };
# oder deine loesung, mit einem strich weniger:
my $self;
$self->{array} = \@array;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2006-01-17 17:07
#61981 #61981
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wenn es bei diesem Array bleibt, würd ich Taulmarills Lösung preferieren. Ich hab auch einige solche Objekte :)\n\n

<!--EDIT|Crian|1137510492-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2006-01-17 17:44
#61982 #61982
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Relais,17.01.2006, 11:29]Vermutlich ist dies noch eher das gewünschte, wenn Du eine Kopie des Arrays haben willst:
$self->{array} = [ @array ];[/quote]
@array ist doch schon eine kopie...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-01-17 11:14.