2015-03-04 13 views
5

Ich habe etwas Perl-Code geerbt, der natürlich weder streng noch Warnungen verwendet, und ich benutze weiterhin nicht initialisierte Variablen und dergleichen.Bracket Code Abschnitt in Gebrauch streng/nicht streng?

Ich mag die Codeabschnitte klammern, dass ich so bin ändern:

use warnings; 
use strict; 

... my code changes and additions ... 

no strict; 
no warnings; 

Und das scheint zu funktionieren, aber ich habe Probleme zu entziffern, was the perldoc on use bedeutet, wenn sie sagt, das ist Compiler-Direktiven, die in den aktuellen "Block-Bereich" importieren. Bedeutet das, dass jeder Bereich eine use strict ungepaarte mit einer no strict haben kann? Ist die no strict am Ende des globalen Bereichs im Wesentlichen die Bedeutung von use strict im selben Umfang im Wesentlichen rückgängig gemacht?

+1

Ich bestätige, das ist eine gute Idee, * vorübergehend * mit vorhandenem Code zu arbeiten. Noch besser wäre es, Ihre Ergänzungen in eine separate Bibliotheksdatei zu integrieren. Sie werden schließlich alles unter strikt zu bringen wollen. – Schwern

+0

Jemand, der '' streng 'natürlich nicht verwendet, erlaubt auch nicht einfache Codeverkapselung ... Ich muss ihren eleventytwo globalen hashtables hinzufügen, Sie sehen ... – stevesliva

+3

Ja, es ist frustrierend, aber es verhindert nicht Sie verwenden Bibliothek Unterroutinen. Sie können sich auf ihre Globals mit '% main :: blah' beziehen (vorausgesetzt, sie befindet sich im Paket main). Noch besser, übergeben Sie ihre Globals, die Sie ändern müssen, in Ihre Subroutinen als Referenz: 'some_new_sub (\% blah)'. Es wird verhindern, dass ihr globales Durcheinander neuen Code infiziert. Dies wird zunächst unordentlich sein, aber es wird Ihnen eine bessere Vorstellung davon geben, welcher Code welche Daten benötigt. Durch all dies wird das Extract Method-Muster Ihr stärkstes Werkzeug sein. – Schwern

Antwort

10

„-Block scope“ bedeutet sowohl use strict; und no strict; Wirkung haben, von wo sie bis zum Ende des innersten umschließenden Block sind, also nein, ein später no strict nicht rückgängig machen keine frühere use strict. Es ändert nur für den innersten Bereich von diesem Punkt im Code an. Also:

{ 
    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

Gute Illustration, danke. Ich hatte zwei Bedenken: 1.) Es gibt einige Beispiele von Leuten, die 'no strict' dafür verwenden, um Änderungen in den unspezifischen Code einzuordnen. 2.) Ich war besorgt, dass es eine Art 2-Pass-Interpretation des Umfangs gibt, die Dinge nicht wie abgebildet funktionieren lässt, daher ist die Bestätigung gut. – stevesliva

+2

"Block scope" wird auch als "lexical scope" bezeichnet. Es ist wichtig zu beachten, dass der lexikalische Gültigkeitsbereich keine Unterprogrammaufrufe * ausführt *. "Lexikalisch" wie in "was Sie auf der Seite lesen". In den seltenen Fällen, in denen symbolische Referenzen verwendet werden sollen, wird "nicht streng" in kleinen Blöcken verwendet. Eine häufige Verwendung ist das Erstellen von Unterprogrammen im laufenden Betrieb. '{keine strengen 'refs'; * {$ Sub_Name} = Sub {...}} '. – Schwern

+1

im Gegensatz zu "dynamischen Bereich", die Unterprogrammaufrufe eingeben – ysth