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

| 您使用哪个安全网?   使用警告; 要么   使用严格 我知道   使用中发现的潜在问题   严格;将导致您的代码停止   当遇到它时,   使用警告时;只会给一个   警告(如命令行开关   -w),然后运行您的代码。 我仍然想知道Perl程序员最常使用哪一个。他们最常使用哪一个?     
已邀请:
        如果使用符号引用(即,字符串表示符号名称),则“ 0”会产生错误。如果您在未声明变量的情况下使用变量,则会产生错误(这鼓励使用词法\'
my
\'变量,但如果您正确声明程序包全局变量,也会感到满意)。如果您在脚本中留下空词(基本上是未引号的字符串,根据Perl的引号定义),也会产生错误。使用\'
strict
\',您可以启用或禁用三种类型的限制中的任何一种,而我可以在范围内的块中启用或禁用。尽管有时合法代码要求在本地禁用其某些功能,但最好还是启用约束。但是,人们应该认真思考这是否真的必要,以及他们的解决方案是否理想。您可以在Perl的POD中以\'strict \'阅读有关狭窄的信息。
use warnings
根据许多标准生成警告消息,这在POD'perllexwarn \'中进行了描述。这些警告与限制无关,而是要注意在其编程中可能遇到的最常见的“陷阱”。最好的做法是在编写脚本时也使用警告。在某些情况下,可能不希望收到该消息,某些警告类别可能会在范围内被本地禁用。其他信息在“警告”中进行了说明。
use diagnostics
使警告变得更加冗长,在开发或学习环境中,尤其是在新移民中,这是非常可取的。诊断可能不会包含在“最终产品”中,但是在开发过程中,它们可以对通常生成的简短消息进行很好的添加。您可以在Perl POD“诊断”中阅读有关诊断的信息。 没有理由强迫自己仅使用上述选项中的一种。特别是,在现代Perl程序中通常应同时使用使用警告和严格使用。 在所有情况下(诊断程序除外,无论如何,诊断程序都只用于开发),可能会在词汇上禁用单个约束或警告。此外,它们的错误可能被
eval{ .... }
,with6ѭ的try / catch块以及其他几种方法所困。如果担心消息会为潜在的攻击者提供有关脚本的更多信息,则可以将消息路由到日志文件。如果存在所述日志文件占用大量空间的风险,那么手头会有一个更大的问题,问题的根源应该得到解决,或者在极少数情况下,只需禁用消息即可。 如今,Perl程序应该是高度严格/警告兼容的最佳实践。     
        两者,当然。如果perl是今天设计的,则使用严格,使用警告将是默认行为。就像在编译器中打开警告一样-为什么您默认不这样做?     
        您所拥有的甚至还不够。 我使用近似于此的代码作为起点。它在我的环境中效果很好,尽管您的行驶里程总是会有所不同。
#!/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工具箱中找到更多有关此类事情的示例,目前从简单到最高级的文件多达50个左右。     
        如链接页面所述,同时使用两者。 该文档可能还不清楚。
use strict
use warnings
遇到了不同的问题;仅当您违反严格的语法要求时,仅遇到警告时,“ 0”不会导致程序立即退出。当您的代码执行的事情不太严重时,您仍然只会打印警告。     
        
use strict;
#use warnings;
use diagnostics; # \"This module extends the terse diagnostics...\" by http://perldoc.perl.org/diagnostics.html
都!但是我更喜欢诊断,而不是警告,它可以为您提供更多信息。     

要回复问题请先登录注册