您在Perl中使用哪个安全网?

Cha*_*hak 8 perl encoding coding-style stack-trace boilerplate

你用哪个安全网

使用警告;

要么

用严格;

我知道

使用严格的潜在问题; 会在遇到代码时立即停止代码,同时使用警告; 只会发出警告(比如命令行开关-w)并让你的代码运行.

我仍然想知道哪一个主要由Perl程序员使用.他们看到哪一个被最多使用?

chr*_*ney 20

当然,两者都有.如果perl是今天设计的,那么使用严格和使用警告将是默认行为.这就像在编译器中打开警告一样 - 为什么默认情况下不会这样做?


tch*_*ist 14

你所拥有的甚至还没有开始.

我使用近似这个代码作为起点.它在我的环境中运行良好,但一如既往,您的里程可能会有所不同.

#!/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.
Run Code Online (Sandbox Code Playgroud)

你可以在Perl Unicode工具箱中找到更多这类事物的例子,目前最多有50个文件,从简单到崇高.

  • 我认为对每行的完整解释的perlboil将是文档的一个很好的补充. (5认同)
  • 当然,这是应该获得所有赞成的答案.:)我可以建议的一个警告是实际阅读并了解为什么汤姆使用这些工具而不是盲目地切割和粘贴.我不能说我理解了所有这些,所以它也让我有所了解. (2认同)

Dav*_*idO 13

use strict如果使用符号引用(即字符串表示符号名称),则会生成错误.如果你使用一个变量而不声明它会产生错误(这会鼓励使用词法' my'变量,但如果正确声明包全局变量也会满足).如果您在脚本中留下裸露的词语(未引用的字符串,基本上是Perl的引号定义),它也会产生错误.使用' strict',您可以启用或禁用三类限制中的任何一种,并且我在范围内的块中执行此操作.最好的做法是启用限制,但有时合法代码要求其某些功能在本地禁用.但是,人们应该长时间地思考这是否真的有必要,以及他们的解决方案是否理想.你可以在Perl的POD中读到有关'严格'的限制.

use warnings根据许多标准生成警告消息,这些标准在POD'perllexwarn'中有描述.这些警告与限制无关,而是注意在他们的编程中可能遇到的最常见的"陷阱".在编写脚本时使用警告是最佳做法.在消息可能不合需要的某些情况下,某个警告类别可能在范围内被本地禁用."警告"中描述了其他信息.

use diagnostics使警告更加冗长,并且在开发或学习环境中,特别是在新手中,这是非常可取的.诊断可能会被排除在"最终产品"之外,但在开发过程中,它们可能是通常生成的简洁消息的一个非常好的补充.您可以在Perl POD"诊断"中阅读有关诊断的信息.

没有理由强迫自己只使用上述选项中的一个或另一个.特别是,使用警告和使用严格通常都应该在现代Perl程序中使用.

在所有情况下(除了您仅用于开发的诊断除外),个别限制或警告可能在词汇上被禁用.此外,他们的错误可能会被困eval{ .... },其中Try::Tiny的try/catch块,和一些其他的方式.如果担心某条消息会向潜在攻击者提供有关脚本的更多信息,则可以将消息路由到日志文件.如果存在所述日志文件占用大量空间的风险,则会出现更大的问题,并且问题的来源应该得到解决,或者在极少数情况下只是禁用该消息.

如今的Perl程序应该是高度严格/警告的最佳实践.


Woo*_*ble 11

如链接页面所示,使用两者.

文档可能有点不清楚.use strictuse warnings抓住不同的问题; use strict不会引起遇到单纯的警告,当你的程序立即退出,只有当你违反了严格的语法要求.当您的代码执行不太严重的事情时,您仍然只会打印警告.


cir*_*100 5

use strict;
#use warnings;
use diagnostics; # "This module extends the terse diagnostics..." by http://perldoc.perl.org/diagnostics.html
Run Code Online (Sandbox Code Playgroud)

都!但我更喜欢诊断,而不是警告,它可以为您提供更多信息.

  • 对于OP的目的(安全网)来说,诊断可能是过度的,但这并不是真正的投票理由. (6认同)