Какую подстраховку вы используете в Perl?

Какую систему безопасности вы используете?

использовать предупреждения;

or

используйте строгий;

я знаю это

Потенциальная проблема, обнаруженная при использовании strict; заставит ваш код немедленно останавливаться, когда он встречается, при этом используйте предупреждения; просто выдаст предупреждение (например, ключ командной строки -w) и позволит вашему коду работать.

Тем не менее, я хочу знать, какой из них в основном используется Perl-программистами. Какой из них они видели чаще всего?


person Chankey Pathak    schedule 18.06.2011    source источник
comment
Я не голосовал за закрытие, но подозреваю, что это потому, что предупреждения и строгие правила делают совершенно разные вещи. Это не вопрос «или / или» - используйте оба варианта.   -  person Sherm Pendley    schedule 18.06.2011
comment
Спасибо за правки. [@starblue: для редактирования заголовка и @tchrist для добавления дополнительных тегов]   -  person Chankey Pathak    schedule 18.06.2011
comment
также вы можете сделать use warnings 'FATAL', чтобы он умирал при предупреждениях.   -  person xenoterracide    schedule 19.06.2011


Ответы (5)


use strict генерирует ошибку, если вы используете символические ссылки (т. Е. Строки для представления имен символов). Он генерирует ошибку, если вы используете переменную без ее объявления (это поощряет использование лексических переменных 'my', но также удовлетворяется, если вы правильно объявляете глобальные переменные пакета). Он также генерирует ошибку, если вы оставляете голые слова в скрипте (строки без кавычек, по сути, в соответствии с определением кавычек Perl). С помощью «strict» вы можете включать или отключать любую из трех категорий ограничений, и я делаю это в рамках определенных блоков. Рекомендуется включать ограничения, хотя в некоторых случаях законный код требует, чтобы некоторые из его функций были локально отключены. Однако следует долго и серьезно подумать, действительно ли это необходимо, и идеально ли их решение. Вы можете прочитать о ограничениях в Perl POD под названием «strict».

use warnings генерирует предупреждающее сообщение на основе многих критериев, которые описаны в POD 'perllexwarn'. Эти предупреждения не имеют ничего общего с ограничениями, а скорее обращают внимание на наиболее распространенные "подводные камни", с которыми можно столкнуться в их программировании. Также рекомендуется использовать предупреждения при написании скриптов. В некоторых случаях, когда сообщение может быть нежелательным, определенная категория предупреждений может быть локально отключена в пределах области действия. Дополнительная информация описана в «предупреждениях».

use diagnostics делает предупреждения более подробными, что очень желательно в среде разработки или обучения, особенно среди новичков. Диагностика, вероятно, не будет включена в «конечный продукт», но в процессе разработки она может стать действительно хорошим дополнением к обычно генерируемым кратким сообщениям. Вы можете прочитать о диагностике в Perl POD "диагностика".

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

Во всех случаях (кроме диагностики, которую вы в любом случае используете только для разработки) отдельные ограничения или предупреждения могут быть лексически отключены. Более того, их ошибки могут быть отловлены с помощью eval{ .... }, с помощью блоков try / catch Try::Tiny и некоторыми другими способами. Если есть опасения по поводу сообщения, дающего потенциальному злоумышленнику дополнительную информацию о сценарии, сообщения могут быть перенаправлены в файл журнала. Если существует риск того, что указанный файл журнала займет много места, существует более серьезная проблема, и источник проблемы должен быть либо устранен, либо, в некоторых редких случаях, просто отключить сообщение.

Программы Perl в настоящее время должны быть очень строгими / совместимыми с предупреждениями, как лучшая практика.

person DavidO    schedule 18.06.2011
comment
Красиво объяснено. +1 Спасибо :) - person Chankey Pathak; 18.06.2011

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

person chrisdowney    schedule 18.06.2011
comment
Это похоже на включение предупреждений в компиляторе. +1 Спасибо :) - person Chankey Pathak; 18.06.2011

То, что у вас есть, даже начинает не хватать.

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

#!/usr/bin/env perl

use v5.12;
use utf8;
use strict;
use autodie;
use warnings; 
use warnings    qw< FATAL utf8      >;
use feature     qw< unicode_strings >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full           >;

# These are core modules:
use Carp                qw< carp croak confess cluck >;
use File::Basename      qw< basename        dirname >;
use Unicode::Normalize  qw< NFD NFKD       NFC NFKC >;
use Getopt::Long        qw< GetOptions              >;
use Pod::Usage          qw< pod2usage               >;

our $VERSION = v0.0.1;

$0 = basename($0);  # shorter messages
## $| = 1;

$SIG{__DIE__} = sub {
    confess "Uncaught exception: @_" unless $^S;
};

$SIG{__WARN__} = sub {
    if ($^S) { cluck   "Trapped warning: @_" } 
    else     { confess "Deadly warning: @_"  }
};

END { 
    local $SIG{PIPE} = sub { exit };
    close STDOUT;
}

if (grep /\P{ASCII}/ => @ARGV) {
   @ARGV = map { decode("UTF-8", $_) } @ARGV;
}

binmode(DATA, ":utf8");

## Getopt::Long::Configure qw[ bundling auto_version ];

if (!@ARGV && -t STDIN) {
    print STDERR "$0: reading from stdin: type ^D to end, ^C to kill...\n";
} 

while (<>) {
    $_ = NFD($_);
    # ...
    print NFC($_);
}

exit;

=pod

=encoding utf8

=head1 NAME

=head1 SYNOPSIS

=head1 DESCRIPTION

=head1 OPTIONS

=head1 EXAMPLES

=head1 ERRORS   

=head1 FILES

=head1 ENVIRONMENT

=head1 PROGRAMS

=head1 AUTHOR

=head1 COPYRIGHT AND LICENCE

=head1 REVISION HISTORY

=head1 BUGS

=head1 TODO

=head1 SEE ALSO

=cut

__END__

Your UTF-8 data goes here.

Вы можете найти больше примеров подобных вещей в действии в Perl Unicode Tool Chest < / a>, в настоящее время около 50 файлов, от простых до возвышенных.

person tchrist    schedule 18.06.2011
comment
Конечно, это ответ, который должен получить все положительные голоса. :) Единственное предостережение, которое я могу предложить, - это на самом деле прочитать и узнать, почему Том использует каждый из этих инструментов, а не просто слепо вырезать и вставлять. Я не могу сказать, что понимаю их все, так что это дает мне повод для погружения. - person DavidO; 19.06.2011
comment
Есть ли причина присутствия и use v5.12;, и use strict;? Я думал, что use strict; подразумевается в use v5.12;. - person Chas. Owens; 19.06.2011
comment
Что ж, одна из причин может быть в пользу менее осведомленных читателей. Я не использовал Perl выше 5.10, поэтому я даже не знал об этой функции в 5.12! - person Dan; 19.06.2011
comment
@Chas, @Dan совершенно прав. Я всегда вставляю это явно, на случай, если кто-то откажется от рева, я не хочу, чтобы use strict потерялся. Точно так же с функцией unicode_strings, которая впервые появилась в 5.12, покупка стала более полезной в 5.14. Я не против избыточности, которая проясняет ситуацию. Я обсуждал use sigtrap, так что ваши деструкторы стреляют. В настоящее время я рассматриваю возможность сделать это частью справочной страницы. - person tchrist; 19.06.2011
comment
Я думаю, что perlboil с полным объяснением каждой строки будет прекрасным дополнением к документации. - person Chas. Owens; 19.06.2011

Используйте оба, как указано на связанной странице.

Документация, возможно, немного неясна. use strict и use warnings ловят разные проблемы; use strict не приведет к немедленному завершению вашей программы при обнаружении простых предупреждений, только если вы нарушите строгие требования синтаксиса. Вы по-прежнему будете получать только предупреждения, если ваш код будет делать менее серьезные вещи.

person Wooble    schedule 18.06.2011
comment
use strict не приведет к немедленному завершению вашей программы при обнаружении простых предупреждений. Спасибо за эту информацию :) +1 - person Chankey Pathak; 18.06.2011

use strict;
#use warnings;
use diagnostics; # "This module extends the terse diagnostics..." by http://perldoc.perl.org/diagnostics.html

Оба! Но я предпочитаю диагностику, а не предупреждения, которые дают вам дополнительную информацию.

person cirne100    schedule 18.06.2011
comment
Есть проблемы с диагностикой ?! Я получаю отрицательный отзыв с этим ответом! - person cirne100; 18.06.2011
comment
диагностика, вероятно, была бы излишней для целей OP (подстраховка), но на самом деле это не повод для отрицательного голоса. - person ikegami; 18.06.2011