Почему используются предупреждения; использовать строгое; не по умолчанию в Perl? - PullRequest
32 голосов
/ 18 мая 2011

Мне интересно, почему

use warnings;
use strict;

не являются значениями по умолчанию в Perl.Они нужны для каждого сценария.Если кому-то (по уважительной причине) необходимо отключить его, он должен использовать no strict и / или использовать какой-либо аргумент командной строки (для однострочников).

Слишком много плохо написанных модулей CPAN (использовать "плохо", чтобы означать без use strict)?Или это потому, что это может сломать много кода уже в производстве?Я уверен, что есть причина, и я хотел бы знать ее.

В 5.14 IO::File загружается автоматически по требованию, разве нельзя было бы сделать что-то подобное с этими основными прагмами?

Ответы [ 5 ]

51 голосов
/ 19 мая 2011

Это для обратной совместимости. В Perl 4 вообще не было строгих правил, и, скорее всего, все еще существуют сценарии, изначально написанные для Perl 4, которые все еще прекрасно работают с Perl 5. Создание строгих автоматических режимов сломало бы эти сценарии. Ситуация еще хуже для однострочников, многие из которых не удосуживаются объявлять переменные. Если сделать строчные строки по умолчанию строгими, это может привести к поломке миллионов сценариев оболочки и Makefile.

Он не может быть загружен автоматически, потому что он добавляет ограничения, а не функции. Одно дело загружать IO :: File, когда метод вызывается для дескриптора файла. Но активировать строгий, если код не сделал что-то запрещенное строгим, бессмысленно.

Если в сценарии указана минимальная версия 5.11.0 или выше (например, use 5.012), тогда строгий автоматически включается . Это не включает предупреждения, но, возможно, это будет добавлено в будущей версии. Кроме того, если вы выполняете OO-программирование на Perl, вы должны знать, что использование Moose автоматически включает и strict, и warnings в этом классе.

17 голосов
/ 18 мая 2011

Если вы работаете на современном Perl, скажем так, вам просто нужно включить его. 5.12 применяется strict за исключением однострочных. Не может быть значением по умолчанию из-за обратной совместимости.

$ cat strict-safe?.pl
use 5.012;
$foo

$ perl strict-safe\?.pl 
Global symbol "$foo" requires explicit package name at strict-safe?.pl line 2.
Execution of strict-safe?.pl aborted due to compilation errors.
16 голосов
/ 19 мая 2011

Ну, use strict по умолчанию сейчас, вроде.

Начиная с Perl 5.12.0, если вам требуется версия Perl> = 5.12.0, в вашем сценарии будут включены все обратно несовместимые функции, включая строгие по умолчанию.

use 5.12.0;
use warnings;

Так же, как:

use strict;
use warnings;
use feature ':5.12';

Он не был включен в более широком смысле, потому что это нарушило бы множество сценариев, от которых люди "просто работают".

Moose также автоматически включает строгие предупреждения и предупреждения при их использовании. Так что, если вы делаете какой-либо Perl OOP на базе Moose, то и здесь вы получаете бесплатный проход.

10 голосов
/ 18 мая 2011

Это философский вопрос, а не вопрос «это не сработает».

Во-первых, perl всегда был под парадигмой типа «вы можете сделать это неправильно, если хотите».Вот почему есть много ненавистников Perl.Многие предпочли бы, чтобы язык всегда заставлял вас писать хороший код, но многие быстрые хакеры не хотят этого.Подумайте:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";'

Теперь было бы легко добавить «my» перед @a, но для одной строки, одноразовые сценарии люди не хотят делать это.

Во-вторых, да, я думаю, что большую часть CPAN действительно нужно будет переписать.

Боюсь, вам не очень хороший ответ.

0 голосов
/ 19 мая 2011

Вы можете использовать модуль common :: sense , если вам нужно:

use utf8;
use strict qw(vars subs);
use feature qw(say state switch);
no warnings;
use warnings qw(FATAL closed threads internal debugging pack
                portable prototype inplace io pipe unpack malloc
                deprecated glob digit printf layer
                reserved taint closure semicolon);
no warnings qw(exec newline unopened);

Уменьшает использование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...