2012-03-20 8 views
6

Dato il seguente codiceControllo per l'esistenza del tasto cancelletto crea chiave

#!/usr/bin/perl 

use Data::Dumper; 

my %hash; 
my @colos = qw(ac4 ch1 ir2 ird kr3); 

foreach my $colo (@colos) { 
    if(exists $hash{output}{$colo}) { 
     print "$colo is in the hash\n"; 
    } 
} 

print Dumper(\%hash); 

ho un hash vuoto che si crea. Ho un array con alcune abbreviazioni in esso. Se faccio scorrere l'array per vedere se questi sono nell'hash, non viene mostrato nulla a STDOUT che è previsto, ma l'hash $ {output} viene creato per qualche motivo. Ciò non ha senso. Tutto quello che sto facendo è se esiste. Dove ho sbagliato?

risposta

6

exists cerca un elemento hash in un determinato hash. Il tuo codice sta generando l'hash
%{ $hash{output} } e controllando se un elemento di hash con la chiave $colo è già presente in quell'hash.

provare quanto segue:

if(exists $hash{output}{$colo}) { 

cambiato in

if(exists $hash{output} and exists $hash{output}{$colo}) { 

È possibile, naturalmente, scrivere un sub che si nasconde che la complessità dal codice.

3

Perl lo crea perché exists verifica l'ultima chiave specificata, non esegue il test in modo ricorsivo. Non dovrebbe essere creato se invece lo fai:

if(exists $hash{output} && exists $hash{output}{$colo}) { 

Tuttavia perché hai bisogno del tasto aggiuntivo? Perché non solo $hash{$colo}? Anche se tu Se hai use strict riceverai un avviso su un valore non inizializzato in $hash.

+0

+1 per la raccomandazione di 'use strict' –

+0

Il codice/hash effettivo è più complesso. L'hash è: $ rotation_hash {output} {oor} {$ colo} {$ tipo} {$ hostname} {file} {$ nomefile} = . È un'utilità per scansionare migliaia di host e creare un breve report che mi indichi quali caselle sono fuori rotazione. Ad esempio, potrebbe avere il seguente aspetto: $ rotation_hash {output} {oor} {ac4} {www} {www10.foo.com} {files} {status.html} = 200 – gdanko

2

Hai già un paio di buone risposte, ma, se vuoi saperne di più su questo comportamento, è normalmente chiamato "autovivificazione" e c'è un CPAN module disponibile per disabilitarlo se preferisci che non lo faccia accadere.

1

Il codice/hash effettivo è più complesso. L'hash è: $ rotation_hash {output} {pavimento} {$ colo} {$ type} {$ hostname} {file} {$ filename} = <html_status_code>

Come altri hanno detto, quando si chiede su l'esistenza di $foo{bar}{fubar}, Perl crea automaticamente $foo{bar} per verificare se esiste $foo{bar}{fubar}. Se si desidera evitare ciò, è necessario verificare se esiste $foo{bar} e, in tal caso, verificare se esiste $foo{bar}{fubar}.

Tuttavia, quello che ha attirato la mia attenzione è stato il tuo hash a sette strati. Quando le tue strutture dati iniziano a diventare così complesse, dovresti davvero usare la codifica Perl Object Oriented. So che molte persone sono spaventate dalla programmazione orientata agli oggetti in Perl, ma Perl è probabilmente uno dei linguaggi più facili da usare per le persone che scelgono OOP.

Se per nient'altro, si utilizza OOP per lo stesso motivo per cui si utilizza use strict;. Quando I use strict;, Perl raccoglierà facilmente dove ho usato $foobar come variabile in un posto, ma poi mi riferisco ad esso come $fubar in un altro posto. Si perde questa protezione con strutture dati complesse. Ad esempio, potresti inserire $rotation_hash{output}{oor} in un posto, ma $rotation_hash{oor}{output} in un altro luogo e lo use strict non lo prenderà. Tuttavia, se si dichiarano oggetti tramite package e si utilizzano le subroutine come metodi e costruttori, si ottiene di nuovo tale valore.

La progettazione orientata agli oggetti consente inoltre di eliminare la necessità di tenere traccia della struttura dei dati. Gli oggetti gestiscono questi per te e puoi concentrarti sulla tua codifica. E non devi creare più file. È possibile semplicemente allegare le definizioni dell'oggetto nella parte inferiore del file.

Ci sono some eccellente tutorials incluso nella documentazione Perl. Se non hai familiarità con OOP Perl, dovresti passare attraverso le esercitazioni e fare un tentativo.

Problemi correlati