2015-03-04 6 views
5

Я унаследовал некоторый код perl, который, конечно, не использует ни строгие, ни предупреждения, и я продолжаю использовать неинициализированные переменные и тому подобное.Секция кодового раздела используется строгое/строгое?

Я хотел бы кронштейн секции коды, которые я модифицирующую так:

use warnings; 
use strict; 

... my code changes and additions ... 

no strict; 
no warnings; 

И это, кажется, работает, но у меня проблемы дешифрования, что the perldoc on use означает, когда он говорит, что они директоры компилятора, которые импортируют в текущую «область блока». Означает ли это, что любая область может иметь use strict непарно с no strict? Является ли no strict в хвосте глобальной области существенно портит значение use strict ранее в той же области?

+1

Я подтвержу, что это хорошая идея * временно * работать с существующим кодом. Еще лучше было бы добавить ваши дополнения в функции в отдельный файл библиотеки. В конце концов вы захотите привести все под строгий характер. – Schwern

+0

Кто-то, кто не «использует строгую», конечно, также не позволяет легко инкапсулировать код ... Я должен добавить к их eleventytwo глобальным хэш-таблицам, вы видите ... – stevesliva

+3

Да, это расстраивает, но это не мешает вы используете библиотечные подпрограммы. Вы можете ссылаться на их глобальные переменные с помощью '% main :: blah' (при условии, что он находится в основном пакете). Еще лучше, передайте свои глобальные переменные, которые вам нужно изменить в свои подпрограммы по ссылке: 'some_new_sub (\% blah)'. Это предотвратит их глобальный беспорядок от заражения новым кодом. Сначала это будет беспорядочно, но это даст вам лучшее представление о том, какой код нуждается в данных. Благодаря этому шаблон метода извлечения станет вашим самым сильным инструментом. – Schwern

ответ

10

«блок-сфера» означает как use strict; и no strict; имеет эффект от того, где они до конца самого внутреннего блока ограждающего, так что нет, позже no strict не отменяет более ранний use strict. Он просто изменяет его для самой внутренней области с этой точки кода. Итак:

{ 
    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

Хорошая иллюстрация, спасибо. У меня было две проблемы: 1.) Есть несколько примеров того, как люди используют 'no strict' для этого, чтобы скопировать изменения в нечеткий код. 2.) Я был обеспокоен тем, что существует какая-то двухпроходная интерпретация сферы, которая может заставить вещи работать не так, как показано на рисунке, поэтому подтверждение хорошее. – stevesliva

+2

«Область блока» также упоминается как «лексический охват». Важно отметить, что лексическая область * не * вводит вызовы подпрограмм. «Лексический», как в «том, что вы читаете на странице». 'no strict 'в маленьких блоках часто используется в редких случаях, когда вы хотите использовать символические ссылки. Обычное использование - это создание подпрограмм «на лету». '{no strict 'refs'; * {$ sub_name} = sub {...}} '. – Schwern

+1

в отличие от «динамического диапазона», который вводит вызовы подпрограмм – ysth

 Смежные вопросы

  • Нет связанных вопросов^_^