Quando si tenta di assegnare una variabile e verificarla per definizione in un'operazione in Perl, come sarebbe utile ad esempio in una condizione di if
, mi sembrerebbe naturale scrivere:Comprensione delle priorità quando si assegna e verifica la definizione in Perl
if (defined my $thing = $object->get_thing) {
$thing->do_something;
}
per quanto riguarda la mia comprensione va, defined
ha la precedenza di un rightward list operator, che è inferiore a quello della cessione, quindi mi aspetto che il mio codice qui sopra per essere equivalente a:
if (defined (my $thing = $object->get_thing)) {
$thing->do_something;
}
Mentre il secondo, il codice tra parentesi funziona, il primo restituisce il seguente errore fatale: "Impossibile modificare l'operatore definito nell'assegnazione scalare".
Non è un grosso problema dover aggiungere parentesi, ma mi piacerebbe capire perché la prima versione non funziona, ad es. che tipo di "cosa" è defined
e qual è la sua precedenza?
Sapete cosa determina che 'defined' ha precedenza più alta dell'assegnazione? Ad esempio, 'print my $ test = 'test'' stampa" test ". – scozy
Ho aggiornato la mia risposta. – ikegami
@scozy: non pensare a "mio" come a un operatore con precedenza. La parola chiave "my" induce un'analisi speciale. – gensym