воскресенье, 27 декабря 2009 г.

Grammar nazi: о прагмах strict и warnings

Давно заметил, что многие коллеги пишут так:

package Package;

use strict;
use warnings;

Как истинного grammar nazi, меня это не может не возмущать, поскольку такой код вводит в заблуждение неокрепшие души насчет области действия данных прагм.

$ perl -le 'package P1; use strict; package P2; $_ = Heil'
Bareword "Heil" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
$ perl -le 'package P1; use warnings; package P2; print'
Use of uninitialized value $_ in print at -e line 1.

Истинные арийцы должны писать только так:

use strict;
use warnings;

package Package;

И да, это относится не только к strict и warnings, а вообще ко всем прагмам, область действия которых — файл. Например, use 5.010 и use utf8.

P. S. Мне могут возразить, что истинные арийцы ни под каким предлогом не могут держать несколько пакетов в одном модуле, но на это я лишь расхохочусь в лицо провокаторам истинно арийским смехом.
P. P. S. Да, и кстати, закон Годвина :-þ
P. P. P. S. И да, я знаю, что по умолчанию используется пакет main. Но тем такой порядок включения прагм более символичен. Особо удолбанные grammar nazi в прошлом могли бы писать

package;

use strict;
use warnings;

package Package;
но в версии 5.010 синтаксис package без параметров наконец убрали. И поделом. Даже в нацизме надобно знать меру.

4 comments:

  1. А можно подробнее? Не понял обоснования.
    ОтветитьУдалить
  2. Обоснование следующее: если областью действия прагмы является весь файл, то будет хорошим тоном включать ее за пределами конкретного пакета.
    ОтветитьУдалить
  3. Утверждение понятно. Я не понял обоснования. Почему за пределами?
    ОтветитьУдалить
  4. В Perl пакет != файл. Если взять другие прагмы, типа base или overload, они работают в пределах пакета. Если в файле несколько пакетов, эти прагмы можно объявить для каждого пакета.

    Действие же таких прагм, как strict или warnings, распространяется на всю лексическую область видимости (в приведенном выше примере — весь файл), безотносительно пакетов.
    ОтветитьУдалить