2011-06-18 7 views
8

あなたはどちらですか?safety netあなたは利用していますか?どの安全ネットをPerlで使用していますか?

警告を使用してください。

又は

厳密使用。

私はその

厳しい使用 でキャッチ潜在的な問題を知っています。コードが発生すると直ちに を停止させます。 警告を使用しています。単にコマンドラインスイッチ -wのような警告を とし、コードを実行させます。

まだPerlプログラマによってどちらが使用されているかを知りたいのですが。彼らはどれが一番使われているのを見ましたか?

+0

投票の理由は? –

+2

私は閉会に投票しませんでしたが、警告と厳密にはまったく違うことがあるためです。それはどちらか/または質問ではありません - 両方を使用してください。 –

+0

編集していただきありがとうございます。 [@starblue:余分なタグを追加するためにタイトルと@tchristを編集するために] –

答えて

13

use strictは、シンボリックリファレンス(つまり、シンボル名を表す文字列)を使用するとエラーが発生します。変数を宣言せずに使用すると、エラーが生成されます(これにより、字句 'my'変数の使用が推奨されますが、パッケージグローバルを正しく宣言しても満足します)。また、スクリプトの中にバアワードがぶら下がっている場合(引用符で囲まれていない文字列、基本的にPerlの引用符の定義によって)、エラーが発生します。 'strict'を使用すると、3つのカテゴリの狭窄のいずれかを有効または無効にすることができ、狭窄したブロック内でそうすることができます。合法的なコードでは、その機能の一部をローカルで無効にする必要があることがありますが、厳密にすることをお勧めします。しかし、これが本当に必要かどうか、そしてその解決策が理想的かどうかについて、長く考えなければなりません。 PerlのPODで厳密なものについて読むことができます。

use warningsは、POD 'perllexwarn'に記述されている多くの基準に基づいて警告メッセージを生成します。これらの警告は狭窄とは関係ありませんが、むしろプログラミングで遭遇する可能性のある最も一般的な「悪夢」を見守ってください。スクリプトの作成中に警告を使用するのがベストプラクティスです。メッセージが望ましくない場合がありますが、特定の警告カテゴリがスコープ内でローカルに無効になることがあります。追加情報については、「警告」を参照してください。

use diagnosticsは、警告をより冗長にし、開発環境や学習環境、特に新規参入者にとっては非常に望ましいことです。診断はおそらく「最終製品」から除外されますが、開発中には通常生成される簡潔なメッセージには本当に素敵な機能が追加されます。 Perl PODの "diagnostics"で診断について読むことができます。

上記のオプションのいずれかを使用する必要はありません。特に、警告を使用し、strictを使用するのは一般に、現代のPerlプログラムで使用されるべきです。

(いずれにしても開発にのみ使用する診断を除く)すべてのケースで、個別の制約や警告が字句的に無効になることがあります。さらに、それらのエラーはeval{ .... }で捕捉され、Try::Tinyのtry/catchブロック、およびその他の方法で捕捉される可能性があります。潜在的な攻撃者にスクリプトに関する情報を与えるメッセージが懸念される場合、メッセージはログファイルにルーティングされる可能性があります。ログファイルがスペースを大量に消費するというリスクがある場合は、より大きな問題が存在し、問題の原因を解決するか、まれにしかメッセージを無効にする必要があります。

最近のPerlプログラムでは、ベストプラクティスとして非常に厳しい/警告に準拠する必要があります。

+0

きちんと説明されています。 +1 ありがとうございました:) –

20

どちらももちろんです。 perlが今日設計されていれば、strictを使用し、デフォルトの動作である警告を使用してください。コンパイラで警告がオンになっているようなものです。なぜデフォルトではそうしないのですか?

+0

コンパイラで警告がオンになっているような感じです。 +1 ありがとう:) –

+1

'no strict;'はコードゴルフには悪いですか? :) – geoffspear

11

リンク先ページに記載されているとおり、両方を使用します。

ドキュメントはおそらく少し不明です。 use strictuse warningsには異なる問題があります。 はではなく、は、厳密な構文要件に違反した場合にのみ、警告が表示されたときにすぐにプログラムを終了させます。あまり深刻ではないコードをコードが実行するときには、警告だけが表示されます。

+0

strictを使用すると、単なる警告に遭遇したときにプログラムがすぐに終了することはありません。 この情報をお寄せいただきありがとうございます:) +1 –

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

両方!しかし、私は、警告の代わりに診断を好みます。これは、より多くの情報を提供します。

+1

診断に問題はありますか?私はこの答えでいくつかの否定的なフィードバックを得ています! – cirne100

+2

これは良いことですね、ありがとう:) +1 –

+6

診断はOPの目的(セーフティネット)のためにおそらく過剰ですが、それは実際にダウンボートする理由ではありません。 – ikegami

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 ([email protected] && -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. 

あなたは現在、単純なものから崇高なまでの約50ファイルまで、PerlのUnicode Tool Chestでのアクションでこの種のものの多くの例を見つけることができます。

+2

もちろん、これはすべてのupvotesを得るべき答えです。 :)私が示唆できる1つの注意点は、Tomが実際に盲目的に切断して貼り付けるのではなく、これらのツールのそれぞれを使用する理由を実際に読んで学ぶことです。私はそれらのすべてを理解しているとは言えないので、私にもダイビングする何かを与える。 – DavidO

+0

'use v5.12;と' use strict; 'の両方が存在する理由はありますか?私は 'use strict;'と 'use v5.12;で暗黙のうちに考えていました。 –

+0

まあ、あまり知識のない読者の利益のための1つの理由かもしれません。私はPerlを5.10以上使用していないので、5.12のこの機能についても認識していませんでした。 – Dan

関連する問題