Schrift
[thread]11785[/thread]

push zu arrayref (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
DanielH
 2008-05-10 19:57
#109520 #109520
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Froschpopo+2008-05-10 17:43:04--
mit @{$array_ref} dereferenziere ich ja alles.


AFAIK ist @{$array_ref} das Selbe, wie @$array_ref. Allerdings funktioniert das Zweite nicht, wenn sich die Array-Referenz in einer anderen Array- / Hash-Referenz befindet.

Und für push brauchst du ja das gesamte Array, und nicht nur ein Element.


Froschpopo+2008-05-10 17:43:04--
Da kann ich ja gleich ein neues Array anfangen und das alte undef setzen


Und was ist dann mit den Daten, die schon im Array stehen? Irgendwie kann ich dir nicht so ganz folgen.
KurtZ
 2008-05-10 19:58
#109521 #109521
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
DanielH+2008-05-10 17:57:04--
Irgendwie kann ich dir nicht so ganz folgen.

Daniel das geht nicht nur dir so ...
TMTOWTDYOG (there's more than one way to dig your own grave)
RPerl
 2008-05-10 19:59
#109522 #109522
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Danke fuer das Beispiel, Daniel.
Hat mir einiges beigebracht :-)
Man kann auch noch weitere schluessel dem hash hinzufuegen, so:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#/usr/bin/perl

use strict;
use warnings 'all';
use Data::Dumper;

my $foo = { a => [0,1,2,3,5]  };

push @{$foo->{a}}, 6,7,8,9;
@{$foo->{b}} = [0,1,2,3,4];

print Dumper $foo


Ich frage mich nur wie man so ein hash mit arrays dynamisch generieren kann?!
KurtZ
 2008-05-10 20:15
#109524 #109524
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
RPerl+2008-05-10 17:59:42--
@{$foo->{b}} = [0,1,2,3,4];


du meinst doch sicher:

Code (perl): (dl )
$foo->{b} = [0,1,2,3,4];


was du schreibst ist 3 fach verschachtelt!!!

NACHTRAG:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
$VAR1 = {
# ...
          'b' => [                         # ?
                   [    
                     0,
                     1,
                     2,
                     3,
                     4
                   ]                              
                 ]                           #?
        };
TMTOWTDYOG (there's more than one way to dig your own grave)
DanielH
 2008-05-10 20:18
#109525 #109525
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Statt @{$foo->{b}} = [0,1,2,3,4]; würde ich $foo->{b} = [0,1,2,3,4]; schreiben. Das erste Beispiel erzeugst ein Array, was das Array mit den Daten enthält. Du wolltest aber vermutlich, dass das Array mit den Daten direkt im Hash steht.


RPerl+2008-05-10 17:59:42--
Ich frage mich nur wie man so ein hash mit arrays dynamisch generieren kann?!



Einfach so:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

$| = 1;
$\ = "\n";

my $foo = {};

for (0..10){
        
        $foo->{$_} = $_
}

print Dumper $foo


edit: $foo->{$_} = $_ # <- hier muss dann natürlich die Array ref. statt der Inhalt von $_ rein
Gast Gast
 2008-05-10 20:56
#109526 #109526
Froschpopo+2008-05-10 17:36:05--
$array_ref->[$count_indexes+1] = $neuer_index

das kannst du auch so schreiben:
$array_ref->[@$array_ref] = $neuer_index;
oder
$array_ref->[$#$array_ref+1] = $neuer_index;
Da braucht es keinen Zähler.


Froschpopo+2008-05-10 17:36:05--
mit @{$array_ref} dereferenziere ich ja alles

Nur wenn du @array=@{$array_ref} machst
ansonsten schreibt du direkt in das Array ohne eine Referenz zu benutzen.

Stell dir eine Referenz wie einen Zeiger vor, der auf die Speicherstelle mit dem Array zeigt. Es beleibt immer das selbe Array außer du kopierst es.

Es gilt:
$$array_ref[1] eq $array_ref->[1] eq @{$array_ref}[1] eq @$array_ref[1]
Froschpopo
 2008-05-10 22:16
#109527 #109527
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hmm, also das funktioniert bei mir nicht:

Das ganze ist ein HTC-Loop:
Code (perl): (dl )
1
2
3
4
while (...) {
   push @loop, { ID => $id, DATUM => $datum, SPIELER => $spieler }
}
$param{SPORTART} = \@loop;


Nun will ich später eventuell außerhalb der while nochmal Elemente hinzufügen:
Code: (dl )
$param{SPORTART}->[$#$param{SPORTART}+1]->{DATUM} = 3;

DanielH
 2008-05-10 22:45
#109528 #109528
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Froschpopo+2008-05-10 20:16:36--
hmm, also das funktioniert bei mir nicht:

Das ganze ist ein HTC-Loop:
Code (perl): (dl )
1
2
3
4
while (...) {
   push @loop, { ID => $id, DATUM => $datum, SPIELER => $spieler }
}
$param{SPORTART} = \@loop;


Nun will ich später eventuell außerhalb der while nochmal Elemente hinzufügen:
Code: (dl )
$param{SPORTART}->[$#$param{SPORTART}+1]->{DATUM} = 3;





Ich hab zwar keine Ahnung, was ein HTC-Loop sein soll, aber ist doch klar, dass das nicht funktioniert. Mit
Code: (dl )
$param{SPORTART}->[$#$param{SPORTART}+1]

hast du ja nur ein neues Element im @loop-Array ausgewählt, und keine Hash-Referenz (was du doch möchtest?!). Und einem Array-Element kann man nix per '->{DATUM} = 3' hinzufügen ;)

Mach besser so was:

Code: (dl )
grep { $_->{DATUM} = 3 } @$param{SPORTART}

wenn du jedem Hash {DATUM} hinzufügen möchtest.
Oder du packst einfach alle Hash-Referenzen in einen Hash, wenn du {DATUM} nur einmal global speichern willst
pq
 2008-05-11 03:08
#109549 #109549
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
DanielH+2008-05-10 20:45:02--
Ich hab zwar keine Ahnung, was ein HTC-Loop sein soll,

ich nehme mal an, eine template-schleife in CPAN:HTC
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
betterworld
 2008-05-11 03:34
#109553 #109553
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Hääääääää?
Also noch mal von vorne: Gibt es ein Problem mit
Code: (dl )
push @$arrayref, $var

und wenn ja, welches?
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



View all threads created 2008-05-10 16:42.