Зачем использовать предупреждения; использовать строго; не умолчанию в Perl?

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

use warnings;
use strict;

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

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

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

Ответ 1

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

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

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

Ответ 2

Если вы на современном 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.

Ответ 3

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

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

use 5.12.0;
use warnings;

То же, что и:

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

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

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

Ответ 4

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

Во-первых, perl всегда находился под "вы можете сделать это неправильно, если хотите" тип парадигмы. Вот почему там много ненавистных людей. Многие предпочли бы, чтобы язык всегда заставлял вас писать хороший код, но многие quick- script -hackers не хотят. Рассмотрим:

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

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

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

Похоже, что вам не понравится хороший ответ.

Ответ 5

Вы можете использовать модуль 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);

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