argra****@users*****
argra****@users*****
2011年 9月 28日 (水) 05:45:46 JST
Index: docs/perl/5.10.1/perllexwarn.pod diff -u /dev/null docs/perl/5.10.1/perllexwarn.pod:1.1 --- /dev/null Wed Sep 28 05:45:46 2011 +++ docs/perl/5.10.1/perllexwarn.pod Wed Sep 28 05:45:46 2011 @@ -0,0 +1,1005 @@ + +=encoding euc-jp + +=head1 NAME +X<warning, lexical> X<warnings> X<warning> + +=begin original + +perllexwarn - Perl Lexical Warnings + +=end original + +perllexwarn - Perl レキシカル警告 + +=head1 DESCRIPTION + +=begin original + +The C<use warnings> pragma enables to control precisely what warnings are +to be enabled in which parts of a Perl program. It's a more flexible +alternative for both the command line flag B<-w> and the equivalent Perl +variable, C<$^W>. + +=end original + +C<use warnings> プラグマは、Perl プログラムのある部分に対してどの警告を +有効にするかを精密に制御できるようにします。 +これはコマンドラインオプション B<-w> および等価な Perl 変数 C<$^W> よりも +より柔軟な代替案です。 + +=begin original + +This pragma works just like the C<strict> pragma. +This means that the scope of the warning pragma is limited to the +enclosing block. It also means that the pragma setting will not +leak across files (via C<use>, C<require> or C<do>). This allows +authors to independently define the degree of warning checks that will +be applied to their module. + +=end original + +This pragma works just like the C<strict> pragma. +This means that the scope of the warning pragma is limited to the +enclosing block. It also means that the pragma setting will not +leak across files (via C<use>, C<require> or C<do>). This allows +authors to independently define the degree of warning checks that will +be applied to their module. +(TBT) + +=begin original + +By default, optional warnings are disabled, so any legacy code that +doesn't attempt to control the warnings will work unchanged. + +=end original + +デフォルトでは、オプションの警告は無効なので、警告を制御しようとしない +レガシーコードは変更なしで動作します。 + +=begin original + +All warnings are enabled in a block by either of these: + +=end original + +あるブロック内で全ての警告を有効にするには以下のどちらかのようにします: + + use warnings; + use warnings 'all'; + +=begin original + +Similarly all warnings are disabled in a block by either of these: + +=end original + +同様に、あるブロック内で全ての警告を無効にするには以下のどちらかのように +します: + + no warnings; + no warnings 'all'; + +=begin original + +For example, consider the code below: + +=end original + +例えば、以下のコードを考えます: + + use warnings; + my @a; + { + no warnings; + my $b = @a[0]; + } + my $c = @a[0]; + +=begin original + +The code in the enclosing block has warnings enabled, but the inner +block has them disabled. In this case that means the assignment to the +scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]"> +warning, but the assignment to the scalar C<$b> will not. + +=end original + +外側のブロックでは警告は有効ですが、内側のブロックでは無効です。 +この場合、スカラ C<$c> への代入では +C<"Scalar value @a[0] better written as $a[0]"> 警告が出ますが、 +スカラ C<$b> への代入では出ません。 + +=head2 Default Warnings and Optional Warnings + +(デフォルトの警告とオプションの警告) + +=begin original + +Before the introduction of lexical warnings, Perl had two classes of +warnings: mandatory and optional. + +=end original + +Before the introduction of lexical warnings, Perl had two classes of +warnings: mandatory and optional. +(TBT) + +=begin original + +As its name suggests, if your code tripped a mandatory warning, you +would get a warning whether you wanted it or not. +For example, the code below would always produce an C<"isn't numeric"> +warning about the "2:". + +=end original + +As its name suggests, if your code tripped a mandatory warning, you +would get a warning whether you wanted it or not. +For example, the code below would always produce an C<"isn't numeric"> +warning about the "2:". +(TBT) + + my $a = "2:" + 3; + +=begin original + +With the introduction of lexical warnings, mandatory warnings now become +I<default> warnings. The difference is that although the previously +mandatory warnings are still enabled by default, they can then be +subsequently enabled or disabled with the lexical warning pragma. For +example, in the code below, an C<"isn't numeric"> warning will only +be reported for the C<$a> variable. + +=end original + +With the introduction of lexical warnings, mandatory warnings now become +I<default> warnings. The difference is that although the previously +mandatory warnings are still enabled by default, they can then be +subsequently enabled or disabled with the lexical warning pragma. For +example, in the code below, an C<"isn't numeric"> warning will only +be reported for the C<$a> variable. +(TBT) + + my $a = "2:" + 3; + no warnings; + my $b = "2:" + 3; + +=begin original + +Note that neither the B<-w> flag or the C<$^W> can be used to +disable/enable default warnings. They are still mandatory in this case. + +=end original + +Note that neither the B<-w> flag or the C<$^W> can be used to +disable/enable default warnings. They are still mandatory in this case. +(TBT) + +=head2 What's wrong with B<-w> and C<$^W> + +(B<-w> や C<$^W> の何が悪いの?) + +=begin original + +Although very useful, the big problem with using B<-w> on the command +line to enable warnings is that it is all or nothing. Take the typical +scenario when you are writing a Perl program. Parts of the code you +will write yourself, but it's very likely that you will make use of +pre-written Perl modules. If you use the B<-w> flag in this case, you +end up enabling warnings in pieces of code that you haven't written. + +=end original + +Although very useful, the big problem with using B<-w> on the command +line to enable warnings is that it is all or nothing. Take the typical +scenario when you are writing a Perl program. Parts of the code you +will write yourself, but it's very likely that you will make use of +pre-written Perl modules. If you use the B<-w> flag in this case, you +end up enabling warnings in pieces of code that you haven't written. +(TBT) + +=begin original + +Similarly, using C<$^W> to either disable or enable blocks of code is +fundamentally flawed. For a start, say you want to disable warnings in +a block of code. You might expect this to be enough to do the trick: + +=end original + +Similarly, using C<$^W> to either disable or enable blocks of code is +fundamentally flawed. For a start, say you want to disable warnings in +a block of code. You might expect this to be enough to do the trick: +(TBT) + + { + local ($^W) = 0; + my $a =+ 2; + my $b; chop $b; + } + +=begin original + +When this code is run with the B<-w> flag, a warning will be produced +for the C<$a> line -- C<"Reversed += operator">. + +=end original + +When this code is run with the B<-w> flag, a warning will be produced +for the C<$a> line -- C<"Reversed += operator">. +(TBT) + +=begin original + +The problem is that Perl has both compile-time and run-time warnings. To +disable compile-time warnings you need to rewrite the code like this: + +=end original + +The problem is that Perl has both compile-time and run-time warnings. To +disable compile-time warnings you need to rewrite the code like this: +(TBT) + + { + BEGIN { $^W = 0 } + my $a =+ 2; + my $b; chop $b; + } + +=begin original + +The other big problem with C<$^W> is the way you can inadvertently +change the warning setting in unexpected places in your code. For example, +when the code below is run (without the B<-w> flag), the second call +to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas +the first will not. + +=end original + +The other big problem with C<$^W> is the way you can inadvertently +change the warning setting in unexpected places in your code. For example, +when the code below is run (without the B<-w> flag), the second call +to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas +the first will not. +(TBT) + + sub doit + { + my $b; chop $b; + } + + doit(); + + { + local ($^W) = 1; + doit() + } + +=begin original + +This is a side-effect of C<$^W> being dynamically scoped. + +=end original + +これは C<$^W> が動的スコープを持つことの副作用です。 + +=begin original + +Lexical warnings get around these limitations by allowing finer control +over where warnings can or can't be tripped. + +=end original + +Lexical warnings get around these limitations by allowing finer control +over where warnings can or can't be tripped. +(TBT) + +=head2 Controlling Warnings from the Command Line + +(コマンドラインから警告を制御する) + +=begin original + +There are three Command Line flags that can be used to control when +warnings are (or aren't) produced: + +=end original + +There are three Command Line flags that can be used to control when +warnings are (or aren't) produced: +(TBT) + +=over 5 + +=item B<-w> +X<-w> + +=begin original + +This is the existing flag. If the lexical warnings pragma is B<not> +used in any of you code, or any of the modules that you use, this flag +will enable warnings everywhere. See L<Backward Compatibility> for +details of how this flag interacts with lexical warnings. + +=end original + +This is the existing flag. If the lexical warnings pragma is B<not> +used in any of you code, or any of the modules that you use, this flag +will enable warnings everywhere. See L<Backward Compatibility> for +details of how this flag interacts with lexical warnings. +(TBT) + +=item B<-W> +X<-W> + +=begin original + +If the B<-W> flag is used on the command line, it will enable all warnings +throughout the program regardless of whether warnings were disabled +locally using C<no warnings> or C<$^W =0>. This includes all files that get +included via C<use>, C<require> or C<do>. +Think of it as the Perl equivalent of the "lint" command. + +=end original + +If the B<-W> flag is used on the command line, it will enable all warnings +throughout the program regardless of whether warnings were disabled +locally using C<no warnings> or C<$^W =0>. This includes all files that get +included via C<use>, C<require> or C<do>. +Think of it as the Perl equivalent of the "lint" command. +(TBT) + +=item B<-X> +X<-X> + +=begin original + +Does the exact opposite to the B<-W> flag, i.e. it disables all warnings. + +=end original + +Does the exact opposite to the B<-W> flag, i.e. it disables all warnings. +(TBT) + +=back + +=head2 Backward Compatibility + +(後方互換性) + +=begin original + +If you are used with working with a version of Perl prior to the +introduction of lexically scoped warnings, or have code that uses both +lexical warnings and C<$^W>, this section will describe how they interact. + +=end original + +If you are used with working with a version of Perl prior to the +introduction of lexically scoped warnings, or have code that uses both +lexical warnings and C<$^W>, this section will describe how they interact. +(TBT) + +=begin original + +How Lexical Warnings interact with B<-w>/C<$^W>: + +=end original + +How Lexical Warnings interact with B<-w>/C<$^W>: +(TBT) + +=over 5 + +=item 1. + +=begin original + +If none of the three command line flags (B<-w>, B<-W> or B<-X>) that +control warnings is used and neither C<$^W> or the C<warnings> pragma +are used, then default warnings will be enabled and optional warnings +disabled. +This means that legacy code that doesn't attempt to control the warnings +will work unchanged. + +=end original + +If none of the three command line flags (B<-w>, B<-W> or B<-X>) that +control warnings is used and neither C<$^W> or the C<warnings> pragma +are used, then default warnings will be enabled and optional warnings +disabled. +This means that legacy code that doesn't attempt to control the warnings +will work unchanged. +(TBT) + +=item 2. + +=begin original + +The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this +means that any legacy code that currently relies on manipulating C<$^W> +to control warning behavior will still work as is. + +=end original + +The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this +means that any legacy code that currently relies on manipulating C<$^W> +to control warning behavior will still work as is. +(TBT) + +=item 3. + +=begin original + +Apart from now being a boolean, the C<$^W> variable operates in exactly +the same horrible uncontrolled global way, except that it cannot +disable/enable default warnings. + +=end original + +Apart from now being a boolean, the C<$^W> variable operates in exactly +the same horrible uncontrolled global way, except that it cannot +disable/enable default warnings. +(TBT) + +=item 4. + +=begin original + +If a piece of code is under the control of the C<warnings> pragma, +both the C<$^W> variable and the B<-w> flag will be ignored for the +scope of the lexical warning. + +=end original + +If a piece of code is under the control of the C<warnings> pragma, +both the C<$^W> variable and the B<-w> flag will be ignored for the +scope of the lexical warning. +(TBT) + +=item 5. + +=begin original + +The only way to override a lexical warnings setting is with the B<-W> +or B<-X> command line flags. + +=end original + +The only way to override a lexical warnings setting is with the B<-W> +or B<-X> command line flags. +(TBT) + +=back + +=begin original + +The combined effect of 3 & 4 is that it will allow code which uses +the C<warnings> pragma to control the warning behavior of $^W-type +code (using a C<local $^W=0>) if it really wants to, but not vice-versa. + +=end original + +The combined effect of 3 & 4 is that it will allow code which uses +the C<warnings> pragma to control the warning behavior of $^W-type +code (using a C<local $^W=0>) if it really wants to, but not vice-versa. +(TBT) + +=head2 Category Hierarchy +X<warning, categories> + +(カテゴリ階層) + +=begin original + +A hierarchy of "categories" have been defined to allow groups of warnings +to be enabled/disabled in isolation. + +=end original + +「カテゴリ」の階層は、警告のグループを分離して警告を有効/無効にできるように +するために定義されています。 + +=begin original + +The current hierarchy is: + +=end original + +現在の階層は: + + all -+ + | + +- closure + | + +- deprecated + | + +- exiting + | + +- glob + | + +- io -----------+ + | | + | +- closed + | | + | +- exec + | | + | +- layer + | | + | +- newline + | | + | +- pipe + | | + | +- unopened + | + +- misc + | + +- numeric + | + +- once + | + +- overflow + | + +- pack + | + +- portable + | + +- recursion + | + +- redefine + | + +- regexp + | + +- severe -------+ + | | + | +- debugging + | | + | +- inplace + | | + | +- internal + | | + | +- malloc + | + +- signal + | + +- substr + | + +- syntax -------+ + | | + | +- ambiguous + | | + | +- bareword + | | + | +- digit + | | + | +- parenthesis + | | + | +- precedence + | | + | +- printf + | | + | +- prototype + | | + | +- qw + | | + | +- reserved + | | + | +- semicolon + | + +- taint + | + +- threads + | + +- uninitialized + | + +- unpack + | + +- untie + | + +- utf8 + | + +- void + +=begin original + +Just like the "strict" pragma any of these categories can be combined + +=end original + +"strict" プラグマと同様、これらのカテゴリは組み合わせることができます + + use warnings qw(void redefine); + no warnings qw(io syntax untie); + +=begin original + +Also like the "strict" pragma, if there is more than one instance of the +C<warnings> pragma in a given scope the cumulative effect is additive. + +=end original + +これも "strict" プラグマと同様、現在のスコープに複数の +C<warnings> プラグマの実体があるときは、効果は加算されます。 + + use warnings qw(void); # only "void" warnings enabled + ... + use warnings qw(io); # only "void" & "io" warnings enabled + ... + no warnings qw(void); # only "io" warnings enabled + +=begin original + +To determine which category a specific warning has been assigned to see +L<perldiag>. + +=end original + +ある特定の警告がどのカテゴリに割り当てられているかを知るには +L<perldiag> を参照してください。 + +=begin original + +Note: In Perl 5.6.1, the lexical warnings category "deprecated" was a +sub-category of the "syntax" category. It is now a top-level category +in its own right. + +=end original + +注意: Perl 5.6.1 では、レキシカル警告カテゴリ "deprecated" は "syntax" +カテゴリの副カテゴリでした。 +今ではそれ自体でトップレベルカテゴリです。 + +=head2 Fatal Warnings +X<warning, fatal> + +(致命的警告) + +=begin original + +The presence of the word "FATAL" in the category list will escalate any +warnings detected from the categories specified in the lexical scope +into fatal errors. In the code below, the use of C<time>, C<length> +and C<join> can all produce a C<"Useless use of xxx in void context"> +warning. + +=end original + +The presence of the word "FATAL" in the category list will escalate any +warnings detected from the categories specified in the lexical scope +into fatal errors. In the code below, the use of C<time>, C<length> +and C<join> can all produce a C<"Useless use of xxx in void context"> +warning. +(TBT) + + use warnings; + + time; + + { + use warnings FATAL => qw(void); + length "abc"; + } + + join "", 1,2,3; + + print "done\n"; + +=begin original + +When run it produces this output + +=end original + +When run it produces this output +(TBT) + + Useless use of time in void context at fatal line 3. + Useless use of length in void context at fatal line 7. + +=begin original + +The scope where C<length> is used has escalated the C<void> warnings +category into a fatal error, so the program terminates immediately it +encounters the warning. + +=end original + +The scope where C<length> is used has escalated the C<void> warnings +category into a fatal error, so the program terminates immediately it +encounters the warning. +(TBT) + +=begin original + +To explicitly turn off a "FATAL" warning you just disable the warning +it is associated with. So, for example, to disable the "void" warning +in the example above, either of these will do the trick: + +=end original + +To explicitly turn off a "FATAL" warning you just disable the warning +it is associated with. So, for example, to disable the "void" warning +in the example above, either of these will do the trick: +(TBT) + + no warnings qw(void); + no warnings FATAL => qw(void); + +=begin original + +If you want to downgrade a warning that has been escalated into a fatal +error back to a normal warning, you can use the "NONFATAL" keyword. For +example, the code below will promote all warnings into fatal errors, +except for those in the "syntax" category. + +=end original + +If you want to downgrade a warning that has been escalated into a fatal +error back to a normal warning, you can use the "NONFATAL" keyword. For +example, the code below will promote all warnings into fatal errors, +except for those in the "syntax" category. +(TBT) + + use warnings FATAL => 'all', NONFATAL => 'syntax'; + +=head2 Reporting Warnings from a Module +X<warning, reporting> X<warning, registering> + +(モジュールから警告を報告する) + +=begin original + +The C<warnings> pragma provides a number of functions that are useful for +module authors. These are used when you want to report a module-specific +warning to a calling module has enabled warnings via the C<warnings> +pragma. + +=end original + +The C<warnings> pragma provides a number of functions that are useful for +module authors. These are used when you want to report a module-specific +warning to a calling module has enabled warnings via the C<warnings> +pragma. +(TBT) + +=begin original + +Consider the module C<MyMod::Abc> below. + +=end original + +Consider the module C<MyMod::Abc> below. +(TBT) + + package MyMod::Abc; + + use warnings::register; + + sub open { + my $path = shift; + if ($path !~ m#^/#) { + warnings::warn("changing relative path to /var/abc") + if warnings::enabled(); + $path = "/var/abc/$path"; + } + } + + 1; + +=begin original + +The call to C<warnings::register> will create a new warnings category +called "MyMod::abc", i.e. the new category name matches the current +package name. The C<open> function in the module will display a warning +message if it gets given a relative path as a parameter. This warnings +will only be displayed if the code that uses C<MyMod::Abc> has actually +enabled them with the C<warnings> pragma like below. + +=end original + +The call to C<warnings::register> will create a new warnings category +called "MyMod::abc", i.e. the new category name matches the current +package name. The C<open> function in the module will display a warning +message if it gets given a relative path as a parameter. This warnings +will only be displayed if the code that uses C<MyMod::Abc> has actually +enabled them with the C<warnings> pragma like below. +(TBT) + + use MyMod::Abc; + use warnings 'MyMod::Abc'; + ... + abc::open("../fred.txt"); + +=begin original + +It is also possible to test whether the pre-defined warnings categories are +set in the calling module with the C<warnings::enabled> function. Consider +this snippet of code: + +=end original + +It is also possible to test whether the pre-defined warnings categories are +set in the calling module with the C<warnings::enabled> function. Consider +this snippet of code: +(TBT) + + package MyMod::Abc; + + sub open { + warnings::warnif("deprecated", + "open is deprecated, use new instead"); + new(@_); + } + + sub new + ... + 1; + +=begin original + +The function C<open> has been deprecated, so code has been included to +display a warning message whenever the calling module has (at least) the +"deprecated" warnings category enabled. Something like this, say. + +=end original + +The function C<open> has been deprecated, so code has been included to +display a warning message whenever the calling module has (at least) the +"deprecated" warnings category enabled. Something like this, say. +(TBT) + + use warnings 'deprecated'; + use MyMod::Abc; + ... + MyMod::Abc::open($filename); + +=begin original + +Either the C<warnings::warn> or C<warnings::warnif> function should be +used to actually display the warnings message. This is because they can +make use of the feature that allows warnings to be escalated into fatal +errors. So in this case + +=end original + +Either the C<warnings::warn> or C<warnings::warnif> function should be +used to actually display the warnings message. This is because they can +make use of the feature that allows warnings to be escalated into fatal +errors. So in this case +(TBT) + + use MyMod::Abc; + use warnings FATAL => 'MyMod::Abc'; + ... + MyMod::Abc::open('../fred.txt'); + +=begin original + +the C<warnings::warnif> function will detect this and die after +displaying the warning message. + +=end original + +the C<warnings::warnif> function will detect this and die after +displaying the warning message. +(TBT) + +=begin original + +The three warnings functions, C<warnings::warn>, C<warnings::warnif> +and C<warnings::enabled> can optionally take an object reference in place +of a category name. In this case the functions will use the class name +of the object as the warnings category. + +=end original + +The three warnings functions, C<warnings::warn>, C<warnings::warnif> +and C<warnings::enabled> can optionally take an object reference in place +of a category name. In this case the functions will use the class name +of the object as the warnings category. +(TBT) + +=begin original + +Consider this example: + +=end original + +Consider this example: +(TBT) + + package Original; + + no warnings; + use warnings::register; + + sub new + { + my $class = shift; + bless [], $class; + } + + sub check + { + my $self = shift; + my $value = shift; + + if ($value % 2 && warnings::enabled($self)) + { warnings::warn($self, "Odd numbers are unsafe") } + } + + sub doit + { + my $self = shift; + my $value = shift; + $self->check($value); + # ... + } + + 1; + + package Derived; + + use warnings::register; + use Original; + our @ISA = qw( Original ); + sub new + { + my $class = shift; + bless [], $class; + } + + + 1; + +=begin original + +The code below makes use of both modules, but it only enables warnings from +C<Derived>. + +=end original + +The code below makes use of both modules, but it only enables warnings from +C<Derived>. +(TBT) + + use Original; + use Derived; + use warnings 'Derived'; + my $a = Original->new(); + $a->doit(1); + my $b = Derived->new(); + $a->doit(1); + +=begin original + +When this code is run only the C<Derived> object, C<$b>, will generate +a warning. + +=end original + +When this code is run only the C<Derived> object, C<$b>, will generate +a warning. +(TBT) + + Odd numbers are unsaf****@main***** line 7 + +=begin original + +Notice also that the warning is reported at the line where the object is first +used. + +=end original + +Notice also that the warning is reported at the line where the object is first +used. +(TBT) + +=head1 SEE ALSO + +L<warnings>, L<perldiag>. + +=head1 AUTHOR + +Paul Marquess +