我正在研究大約4000行的Perl CGI腳本。我們的編碼風格通常包括use strict
和use warnings
,但在這個特定(相當古老)的文件中,「使用警告」被註釋掉,並且註釋表明啓用警告會氾濫Apache日誌。只能在一個子程序中使用「警告」嗎?
現在我打算將一些代碼分隔成一個新的子程序。我想至少在那裏有use warnings
。我怎樣才能安全地限制use warnings
對一個子程序的影響?只是將use
子句放在子例程中就可以完成這項工作嗎?
我正在研究大約4000行的Perl CGI腳本。我們的編碼風格通常包括use strict
和use warnings
,但在這個特定(相當古老)的文件中,「使用警告」被註釋掉,並且註釋表明啓用警告會氾濫Apache日誌。只能在一個子程序中使用「警告」嗎?
現在我打算將一些代碼分隔成一個新的子程序。我想至少在那裏有use warnings
。我怎樣才能安全地限制use warnings
對一個子程序的影響?只是將use
子句放在子例程中就可以完成這項工作嗎?
是的,use warning
的使用將在您所寫的範圍內。
寫入use warning
裏面的子只會影響給定例程(或塊)。
例如片斷
sub foo {
use warnings;
print my $a;
}
{
use warnings;
print my $b;
}
foo;
print my $c;
輸出
Use of uninitialized value $b in print at foo.pl line 8.
Use of uninitialized value $a in print at foo.pl line 3.
注意,沒有警告拋出有關使用print my $c
。
是什麼文件說?
該編譯作品就像strict編譯。 這意味着警告雜注的範圍僅限於封閉塊。它也 意味着雜注設置不會跨文件泄漏(通過使用, 要求或做)。這允許作者獨立定義將應用於其模塊的警告檢查程度 。
剛剛找到自己的答案在 「的perldoc perllexwarn」:
...the scope of the warning pragma is limited to the enclosing block.
所以下面應該工作:
是,其他人指出。但在我看來,建議您最好在全球範圍內啓用警告,並在有問題的部分代碼中將其關閉。
use warnings;
sub new_method {
# shiny new code
}
sub old_method {
no warnings;
# nasty old code
}
打開全局警告,然後關閉特定部分聽起來像是一個很好的計劃。
您不必在每個sub
的範圍內放置use warnings;
或no warnings;
。您可以使用大括號來創建專門的範圍,例如。
use warnings;
sub nice_new_sub_1 { ... }
sub nice_new_sub_2 { ... }
{
no warnings;
sub nasty_old_sub_3 { ... }
sub nasty_old_sub_4 { ... }
sub nasty_old_sub_5 { ... }
}
此外,請考慮只關閉那些需要使其工作乾淨的警告,例如,
{
no strict 'refs';
sub nasty_old_sub_3 { ... }
sub nasty_old_sub_4 { ... }
}
use warnings
可以在詞彙上使用的答案是正確的。全球使用no warnings
詞法和use warnings
的解決方案更爲正確。最好的解決方案是修復所有警告。介於兩者之間的地方在於重定向錯誤。
use warnings;
open STDERR, ">>", "foo/error.log" or die $!;
把它留給了一段時間,然後運行:
perl -nlwe '$a{$_}++ }{ print for keys %a' foo/error.log > foo/errors.dedupe
通過代碼和修復的警告。很可能,如果腳本正在工作,它們將變得微不足道。但除非你檢查,你怎麼知道?
如果最終你認爲它不值得修復所有警告的麻煩,那麼只要刪除警告和錯誤重定向,並使用警告詞法。
正確。你甚至可以比塊更小,只需用'無警告'再次禁用警告; (介意最後的-s) – Konerak 2012-03-14 10:03:46