Cha*_*hak 8 perl encoding coding-style stack-trace boilerplate
你用哪个安全网?
使用警告;
要么
用严格;
我知道
使用严格的潜在问题; 会在遇到代码时立即停止代码,同时使用警告; 只会发出警告(比如命令行开关-w)并让你的代码运行.
我仍然想知道哪一个主要由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个文件,从简单到崇高.
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 strict
并use warnings
抓住不同的问题; use strict
会不会引起遇到单纯的警告,当你的程序立即退出,只有当你违反了严格的语法要求.当您的代码执行不太严重的事情时,您仍然只会打印警告.
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)
都!但我更喜欢诊断,而不是警告,它可以为您提供更多信息.