Come passare al хешу in Perl

Il compito. Nel codice Perl programma un hash %h. In questo хеше ci sono coppie di valori. Bisogno di andare su tutti gli elementi di hash e di eseguire azioni con ogni elemento.

Camminare per хешу con l'aiuto di foreach

Spesso, il modo più comodo per aggirare hash è quello di utilizzare foreach. Ecco un esempio di codice:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
}

Qui tutto è abbastanza semplice. Per prima cosa creiamo un hash %h in cui ci sono tre coppie di valori. Più in là si trova il ciclo. Con l'aiuto di keys %h abbiamo ottenuto un elenco di tutte le chiavi hash (in questo esempio, questa è una linea di 'a', 'b' e 'asdf'). La riga con la chiave viene inserito nella variabile $key e viene eseguito il corpo del ciclo, poi in $key è inserito il seguente chiave di hash e di nuovo viene eseguito il corpo del ciclo, e così accade per tutte le chiavi.

Se salvare il codice in un file script.pl e compiere la sua perl script.pl, sullo schermo viene visualizzato un insieme di coppie di valori, che sono contenute in хеше:

b - 20
asdf - Hello
a - 1

Hash è un insieme non ordinato di coppie di valori. E in conclusione questo è un bene visto — l'ordine in cui sono stati allevati elementi di hash non coincide con l'ordine in cui sono stati definiti nel codice di un programma. E se eseguire questo script più volte, l'ordine degli elementi nel ritiro cambierà. keys %h restituisce un elenco di chiavi hash in ordine casuale. Se è necessario per l'ordine è sempre lo stesso, per questo, ad esempio, è possibile utilizzare l'ordinamento foreach my $key (sort keys %h) {.

Passare al хешу con l'aiuto di while e each

Un altro modo per aggirare l'intero hash è utilizzare un ciclo while e la parola chiave each. Ecco il codice che funziona esattamente come nell'esempio precedente:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";
}

each %h restituisce una lista di due elementi — chiave di hash e il relativo valore. Allo stesso modo, come e in caso di keys l'ordine in cui each restituisce coppie di valori non è definito. Diverse esecuzioni dello stesso i programmi saranno rimborsare le coppie in diverse formazioni.

Assegniamo i valori che ha restituito each in variabili. each si ricorda che alle coppie di hash ha già dato e al successivo utilizzo restituisce un'altra coppia di valori. Questo continuerà fino a quando each non restituirà tutte le coppie, dopo che lui restituisce una lista vuota. Mentre each restituisce una coppia di valori viene eseguito il corpo while ciclo, una volta che restituisce una lista vuota, ciclo whiletermina.

La modifica dei valori in хеше

Quando si utilizza foreach ciclo, keys %h viene eseguita una sola volta. Quando si utilizza whileciclo each eseguito ad ogni iterazione.

Estendere l'attività precedente — abbiamo bisogno non solo di visualizzare tutti gli elementi di hash, ma ancora e sostituirli. E ' completamente senza problemi si può fare quando si utilizza foreach e keys:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
    $h{ $key . $key } = $h{$key};
    delete $h{$key};
}

print Dumper \%h;

L'output del programma:

asdf - Hello
a - 1
b - 20
$VAR1 = {
          'bb' => 20,
          'aa' => 1,
          'asdfasdf' => 'Hello'
        };

Ma così non si arriva a fare quando utilizzare each:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";

    # error!
    $h{ $key . $key } = $value;
    delete $h{$key};
}

print Dumper \%h;

Quando si esegue questo programma, sullo schermo apparirà qualcosa di simile:

Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
b - 20
bb - 20
bbbb - 20
asdf - Hello
$VAR1 = {
          'asdfasdf' => 'Hello',
          'bbbbbbbb' => 20,
          'a' => 1
        };

each ha restituito un paio di valori di hash, e poi cambiamo hash. Succede la prossima iterazione del ciclo e eachrestituisce un paio di modificato hash e può restituire la coppia, che ha appena aggiunto.

Quindi, se durante la ricerca per indicizzazione hash bisogno di cambiare, allora avete bisogno di utilizzare foreach e keys. Quando si utilizza while e each il programma non funzionerà correttamente.

Temi correlati

Altri articoli