2013-07-15 11 views
7

Sintomo: $c="foo"; genera un errore e non lo è $b="foo";.Perl, comportamento variabile, discrepanza basata su nome

Il mio script è letteralmente a 3 righe. Quanto segue non produce errori o avvisi
use strict;
$b = "foo";
print $b;
ma se il cambiamento per quanto segue, ho un "richiede esplicito nome del pacchetto" errore.
use strict;
$c = "foo";
print $c;,

Capisco che use strict; richiede le variabili devono essere dichiarate prima dell'uso, e cambiando $c = "foo";-my $c = "foo"; effettivamente evitare l'errore, ma questo da solo non spiega la discrepanza.

Qualcuno può fare un po 'di luce qui? Sono sicuro che mi manca qualcosa di ovvio. Sto eseguendo Strawberry Perl v5.16.3 in Windows 7 x64. Sto modificando in NPP ed eseguendo i miei script dalla riga di comando, tramite c:\strawberry> perl test.pl

+6

A causa del loro significato speciale per 'sort', non si dovrebbe mai usare' $ un 'e' $ b' nel tuo codice in generale, anche scontando questa differenza di comportamento che hai trovato. – DVK

+0

Sembra una buona abitudine, grazie DVK. –

risposta

8

Alcune variabili globali come $_, $a, $b sono effettivamente predichiarati. Pertanto, le variabili $a e $b possono essere utilizzati senza dichiarazioni supplementari in un blocco sort, dove hanno i valori di due elementi:

use strict; 
my @nums = (1, 5, 3, 10, 7); 
my @sorted = sort { $a <=> $b } @nums 
+0

Grazie, apprezzo la tua spiegazione e l'esempio. Questo ha senso per me ora. –

17

Dalla documentazione strict:

A causa del loro uso speciale da sort(), le variabili $ a e $ b sono esenti da questo controllo.

+0

Grazie per il riferimento! Molto utile. –

Problemi correlati