Devo determinare se un hash Perl ha una determinata chiave, ma quella chiave verrà mappata su un valore undef. In particolare, la motivazione è vedere se i flag booleani durante l'utilizzo di getopt()
con un riferimento hash sono passati in esso. Ho già cercato sia su questo sito che su Google, e non sono applicabili exists()
e defined()
per la situazione, vedono solo se il valore per una determinata chiave non è definito, non controllano se l'hash ha effettivamente la chiave. Se ho un RTFM qui, per favore indicami il manuale che spiega questo.Come determinare se un hash Perl contiene un mapping di tasti a un valore non definito?
risposta
esiste() e definita() non sembrano essere applicabili per la situazione, vedono solo se il valore di una data chiave è indefinito, hanno non verificare se l'hash ha effettivamente la chiave
errato. Questo è infatti ciò che defined()
fa, ma exists()
fa esattamente ciò che si vuole:
my %hash = (
key1 => 'value',
key2 => undef,
);
foreach my $key (qw(key1 key2 key3))
{
print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n";
print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n";
}
produce:
$hash{key1} exists: yes $hash{key1} is defined: yes $hash{key2} exists: yes $hash{key2} is defined: no $hash{key3} exists: no $hash{key3} is defined: no
La documentazione relativa a queste due funzioni è disponibile presso la riga di comando a perldoc -f defined
e perldoc -f exists
(o leggere la documentazione per tutti i metodi su perldoc perlfunc
*). La documentazione web ufficiale è qui:
* Visto che specificamente menzionate RTFM e potrebbe non essere a conoscenza delle posizioni della documentazione Perl, mi permetta anche sottolineare che è possibile ottenere un indice completo di tutti i perldocs allo perldoc perl
o allo http://perldoc.perl.org.
Se sto leggendo la tua domanda correttamente, penso che tu sia confuso riguardo a exists. Dalla documentazione:
esiste ESPR
Data un'espressione che specifica un elemento hash o elemento di un array, restituisce vero se l'elemento specificato nella hash o array è mai stato inizializzato, anche se il valore corrispondente non è definito.
Ad esempio:
use strict;
use warnings;
my %h = (
foo => 1,
bar => undef,
);
for my $k (qw(foo bar baz)){
print $k, "\n" if exists $h{$k} and not defined $h{$k};
}
Risposta breve:
if (exists $hash{$key} and not defined $hash{$key}) {
...
}