Thread Hash als Schleifenbedingung in Schleife ändern (4 answers)
Opened by bianca at 2010-08-10 20:00

MatthiasW
 2010-08-10 21:40
#140522 #140522
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Du erstellst die Liste der Schlüssel (einmalig!) und iterierst über diese. Das Ändern von $nr hat keine weitere Bedeutung, man kann nicht "zurückspringen" und selbst wenn man es könnte, würde man ständig wieder in den Abzweig $i == 3 geraten. Da %hash nun aber keinen Wert mehr hinter dem Schlüssel "5" gespeichert hat, bekommst du die 'uninitialized...' Meldung.

Ich frage mich erneut weshalb du keinen Array verwendest? Wie auch immer, spontan fällt mir ein Flag und eine while-Schleife ein, um das gewünschte Verhalten zu erzielen, aber es gibt garantiert wesentlich schönere Möglichkeiten ;-)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl

use strict;
use warnings;

my %hash = (
    0=>'nul',
    1=>'foo',
    2=>'bar',
    3=>'max',
    4=>'mor',
    5=>'zig',
);
my @keys = sort {$a <=> $b} grep {$_ > 1} keys %hash;
my $i = 0;
my $flag = 1; # damit der Abzweig nur einmal betreten wird

while ( $i < @keys ) {
    if ( $flag && $keys[$i] == 3 ) {
        $flag = 0;
        %hash = (
            0=>'nul',
            1=>'foo',
            2=>'bar',
            3=>'mor',
            4=>'zig',
        );
        @keys = sort { $a <=> $b } grep { $_ > 1 } keys %hash;
        $i--;
        next;
    } # if
    print "$keys[$i] => $hash{$keys[$i]}\n";
} continue { $i++ }

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

View full thread Hash als Schleifenbedingung in Schleife ändern