Sven: Array leeren - warum geht's nicht?

Hello,

=================================

%bla = ("a","text", "b","text", "c","text");

print "vorher:\n";
while (($a, $b) = each(%bla)) {  print "$a => $b\n"; }

map("undef", %bla);

print "\nnachher:\n";
while (($a, $b) = each(%bla)) {  print "$a => $b\n"; }

=================================

Ausgabe:

vorher:
c => text
a => text
b => text

nachher:
c => text
a => text
b => text

Mit "delete" kommt genau das gleiche. Was ich jedoch gerne hätte, wäre ein geleertes Array. D.h. sowas:

vorher:
c => text
a => text
b => text

nachher:
c =>
a =>
b =>

Warum geht map() nicht? Was muss ich hier machen?

Gruß,

Sven

  1. Hi,
    erstens hast du kein Array, sondern einen Hash. Warum machst du es so kompliziert?
    %bla = (); würde doch auch helfen.

    Markus.

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
    1. Hola,

      erstens hast du kein Array, sondern einen Hash.

      egal.

      %bla = (); würde doch auch helfen.

      Ja, aber dann gibt's die Elemente a, b, c nicht. ich hätte sie gerne leergeräumt, mehr nicht.

      Gruß,

      sven

  2. use Mosche;

    [alle Values in einem Hash undef setzen]

    Du hast map falsch benutzt.
    Lies "perldoc -f map":
    %hash = map { ($_ => undef) } keys %hash;

    Ist das gleiche wie:
    foreach (keys %hash) {
       $hash{$_} = undef;
    }

    map liefert einen neuen Array (bzw hier Hash) zurück und operiert nicht auf dem alten. Außerdem willst du nur die Schlüssel durchlaufen.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
  3. Hallo,

    =
    %bla = ("a","text", "b","text", "c","text");

    vorher

    while( ($k, $v) = each %bla){ print "$k \t $v \n" }

    values leeren

    foreach my $k (keys %bla){ $bla{$k} = undef }

    print "\n\n-------- nachher ------------------------\n\n";
    while( ($k, $v) = each %bla){ print "$k \t $v \n" }

    bezüglich map() siehe Matti's post.

    Gruss, Rolf