2015-09-07 9 views
11

Considerare i seguenti programmi in Perl.Perché un elenco di undef non è un valore di sola lettura o costante in Perl?

use strict; 
use warnings; 

my @foo = qw(a b c); 
undef = shift @foo; 

print scalar @foo; 

Questo morirà con un messaggio di errore:

Modification of a read-only value attempted at ...

Utilizzando un constat darà un errore diverso:

1 = shift @foo; 

Can't modify constant item in scalar assignment at ...
Execution of ... aborted due to compilation errors.

Lo stesso se facciamo questo:

(1) = shift @foo; 

Tutti questi hanno senso per me. Ma inserire undef in un elenco funzionerà.

(undef) = shift @foo; 

Ora stampa 2.

Naturalmente questo è pratica comune se si dispone di un gruppo di valori di ritorno e desideri solo quelle specifiche, come qui:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename); 

La nona riga del codice di esempio in perldoc -f undef mostra questo, butthere c'è spiegazione.

La mia domanda è: come viene gestito internamente da Perl?

risposta

10

Internamente, Perl ha diversi operatori per l'assegnazione scalare e l'assegnazione degli elenchi, anche se entrambi sono scritti nel codice sorgente =. E l'operatore di assegnazione lista ha il caso speciale per undef che stai chiedendo.

+0

Potete fornire un collegamento alla fonte? – simbabque

+3

Per cosa, esattamente? Il codice sorgente di Perl non è esattamente semplice. Puoi consultare https://github.com/Perl/perl5/blob/blead/op.c e cercare 'op_sassign' e' op_aassign', se questo ti aiuta. Oppure, probabilmente più utile, vedi il bytecode compilato facendo qualcosa di simile a questo: 'perl -MO = Terse -E '(undef) = 1;'' –

+0

Scusa, avrei dovuto formularlo in modo diverso. Quello che intendevo era, puoi fornire qualcosa per confermare quella spiegazione? Dal momento che non hai collegato alla documentazione dicendo che pensavo avessi cercato altrove, molto probabilmente la fonte. :) – simbabque