2012-03-14 48 views
4

我正在研究大約4000行的Perl CGI腳本。我們的編碼風格通常包括use strictuse warnings,但在這個特定(相當古老)的文件中,「使用警告」被註釋掉,並且註釋表明啓用警告會氾濫Apache日誌。只能在一個子程序中使用「警告」嗎?

現在我打算將一些代碼分隔成一個新的子程序。我想至少在那裏有use warnings。我怎樣才能安全地限制use warnings對一個子程序的影響?只是將use子句放在子例程中就可以完成這項工作嗎?

回答

13

是的,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


是什麼文件說?

  • perldoc.perllexwarn

    該編譯作品就像strict編譯。 這意味着警告雜注的範圍僅限於封閉塊。它也 意味着雜注設置不會跨文件泄漏(通過使用, 要求或做)。這允許作者獨立定義將應用於其模塊的警告檢查程度 。

+1

正確。你甚至可以比塊更小,只需用'無警告'再次禁用警告; (介意最後的-s) – Konerak 2012-03-14 10:03:46

2

剛剛找到自己的答案在 「的perldoc perllexwarn」:

...the scope of the warning pragma is limited to the enclosing block. 

所以下面應該工作:

​​
4

是,其他人指出。但在我看來,建議您最好在全球範圍內啓用警告,並在有問題的部分代碼中將其關閉。

use warnings; 

sub new_method { 
    # shiny new code 
} 

sub old_method { 
    no warnings; 

    # nasty old code 
} 
2

打開全局警告,然後關閉特定部分聽起來像是一個很好的計劃。

您不必在每個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 { ... } 
} 
2

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 

通過代碼和修復的警告。很可能,如果腳本正在工作,它們將變得微不足道。但除非你檢查,你怎麼知道?

如果最終你認爲它不值得修復所有警告的麻煩,那麼只要刪除警告和錯誤重定向,並使用警告詞法。

相關問題