2013-05-07 13 views
7

Running perl 5.12.4 È possibile ottenere la disparità tra il risultato di una funzione quando un hash viene assegnato all'interno dell'istruzione return o in precedenza. Più semplice esempio è:perl assegnazione a hash in subroutine return diventa strana

perl -e 'sub s1 { 
    my @a=qw/b 1 c 2 a 3 a 4/; 
    my %[email protected]; 
    return %h 
    } 
    print "@{[ s1()]}\n"' 
c 2 a 4 b 1 


perl -e 'sub s1 { 
    my @a=qw/b 1 c 2 a 3 a 4/; 
    my %[email protected]; 
    return %[email protected] 
    } 
    print "@{[ s1()]}\n"' 
c 2 c 2 a c 

Perché la (ri) assegnazione di hash nella dichiarazione di ritorno (2 ° esempio) corrotto l'hash restituita?

+2

Confermato. Questo è veramente strano Ma quando ho eseguito il codice su v14.2 o v16.3 ha funzionato senza problemi → sembra essere stato corretto, anche se non riesco a vedere alcuna menzione delle correzioni correlate nelle perldeltas. – amon

+0

Esecuzione del secondo esempio su perl 5.16.2, ottengo 'b 1 c 2 a 4' – friedo

+0

Questo è un po 'strano. Posso ** replicarlo su una delle mie macchine: 'Questo è perl 5, versione 12, subversion 4 (v5.12.4) creato per darwin-thread-multi-2level' – chrsblck

risposta

2

A causa di un bug. Sembra che sia stato corretto in 5.14.0. (. Presente a 5.12.4 non presenti in 5.14.0)

Minimal caso di test:

perl -E"say %h = qw/b 1 c 2 a 3 a 4/" 
+0

Grazie a tutti per le vostre risposte. Accetto che il mio sito abbia bisogno di aggiornare la sua versione Perl alla 5.14. È sempre bello avere la propria sanità mentale confermata quando le basi del software iniziano a cedere. –

+0

@RobN Si intende l'aggiornamento almeno alla 5.14 (la versione 5.18 dovrebbe essere disponibile in una settimana o così. Sebbene possa causare piccoli bug nella base di codice per mostrare le loro facce in massa). –