2015-03-04 37 views
5

Ho ereditato del codice perl che ovviamente non usa né rigidi né avvisi e continuo a utilizzare variabili non inizializzate e simili.Sezione codice staffaggio in uso strict/no strict?

vorrei racchiudere le sezioni di codice che sto modificando in questo modo:

use warnings; 
use strict; 

... my code changes and additions ... 

no strict; 
no warnings; 

E che sembra funzionare, ma sto avendo problemi di decifrare ciò che the perldoc on use significa che quando si dice che questi sono direttive del compilatore che importano nell'attuale "scope scope". Significa che qualsiasi scope può avere un use strict spaiato con un no strict? Lo no strict alla fine dell'ambito globale annulla essenzialmente il significato di use strict in precedenza nello stesso ambito?

+1

Confermerò che questa è una buona idea per * temporaneamente * lavorare con il codice esistente. Ancora meglio sarebbe mettere le tue aggiunte in funzioni in un file di libreria separato. Alla fine vorrai portarlo tutto sotto rigoroso. – Schwern

+0

Qualcuno che non usa 'strict strict' ovviamente non consente un facile incapsulamento del codice ... Devo aggiungere alle loro oltre ventisette hash globali, vedi ... – stevesliva

+3

Sì, è frustrante, ma non previene da usare le subroutine della libreria. Puoi fare riferimento alle loro globali con '% main :: blah' (assumendo che sia nel pacchetto principale). Ancora meglio, passa le loro globali che devi modificare nelle subroutine per riferimento: 'some_new_sub (\% blah)'. Impedirà al loro pasticcio globale di infettare nuovo codice. All'inizio questo sarà disordinato, ma ti darà un'idea migliore di quale codice ha bisogno di quali dati. Attraverso tutto questo, il modello del metodo di estrazione sarà il tuo strumento più forte. – Schwern

risposta

10

"scope blocco" significa sia use strict; e no strict; hanno effetto da dove sono alla fine del blocco più interno, così no, una successiva no strict non annullare una precedente use strict. Lo cambia solo per lo scopo più interno da quel punto nel codice. Quindi:

{ 
    use strict; 
    # strict in effect 
    { 
     # strict still in effect 
     no strict; 
     # strict not in effect 
    } 
    # strict in effect 
    no strict; 
    # strict not in effect 
    use strict; 
    # strict in effect 
} 
+0

Buona illustrazione, grazie. Avevo due dubbi: 1.) Ci sono pochi esempi di persone che usano 'no strict' per questo, per tenere conto delle modifiche al codice unstrict. 2.) Ero preoccupato che ci fosse una sorta di interpretazione a 2 passaggi dell'oscilloscopio che potrebbe rendere le cose non funzionanti come illustrato, quindi la conferma è buona. – stevesliva

+2

"Ambito del blocco" viene anche definito "ambito lessicale". È importante notare che l'ambito lessicale * non * inserisce le chiamate di subroutine. "Lessico" come in "ciò che leggi nella pagina". 'no strict' in small blocks è spesso usato nelle rare occasioni in cui si vogliono usare riferimenti simbolici. Un uso comune è la creazione di subroutine al volo. '{no strict 'refs'; * {$ sub_name} = sub {...}} '. – Schwern

+1

in contrapposizione a "ambito dinamico" che immette le chiamate di subroutine – ysth