2011-05-18 70 views
32

我不知道爲什麼爲什麼使用警告;嚴格使用;在Perl中不是默認的?

use warnings; 
use strict; 

並不在Perl違約。每個腳本都需要它們。如果某人(出於正當理由)需要禁用它們,則應該使用no strict和/或應該使用某些命令行參數(對於單行)。

是否有太多寫得很糟糕的CPAN模塊(使用「很糟糕」來表示沒有use strict)?還是因爲這可能會破壞已經在生產中的很多代碼?我確信有一個原因,我想知道它。

In 5.14 IO::File是根據需要自動加載的,使用這些基本的編譯指示可以做到這樣嗎?

+4

另請參閱此PerlMonks討論:[爲什麼不C 默認?](http://www.perlmonks.org/?node_id=403225) – toolic 2011-05-18 20:16:24

+0

可能的重複[爲什麼不在Perl中使用嚴格和警告? ](http://stackoverflow.com/questions/18064509/why-not-use-strict-and-warnings-in-perl) – 2013-08-10 02:41:09

回答

50

這是爲了向後兼容。 Perl 4完全沒有嚴格的規定,並且最有可能的仍然是最初爲Perl 4編寫的腳本,這些腳本仍然可以在Perl 5中正常工作。嚴格自動會破壞這些腳本。對於單線運動員來說,情況更糟,其中許多運動員不願意聲明變量。默認情況下嚴格限制單行程序可能會導致數百萬個shell腳本和Makefiles出現在那裏。

它不能被自動加載,因爲它增加了限制,而不是功能。在文件句柄上調用方法時加載IO :: File是一回事。但是,除非代碼執行嚴格禁止的操作,否則嚴格激活是沒有意義的。

如果一個腳本指定5.11.0或更高版本的最低版本(例如use 5.012),那麼strict is turned on automatically。這不會啓用警告,但可能會在未來版本中添加。此外,如果您使用Perl進行OO編程,則應該知道使用Moose會自動啓用該類中的strictwarnings

+0

在Perl 5中有很多東西都在Perl 5中破解,比如包裝說明符。不要介意它無法指定'嚴格';它根本沒有任何詞法變量範圍,所以在Perl 4中工作的腳本不可能在嚴格的Perl 5中工作。 主要關注的是Perl * 5 *腳本,不考慮'strict',特別是那些單線隊員。 – 2016-05-31 22:20:31

+1

@MarkReed,因爲包說明符仍在Perl 5中工作;他們只是不推薦(例如[Acme :: Do not](https://metacpan.org/pod/Acme::Don::t))。 AFAIK,大多數Perl 4代碼都可以在Perl 5中使用(只要你不嘗試'嚴格使用')。 – cjm 2016-05-31 22:48:49

+0

好吧,我會跳。 'perl -MText :: CSV -E「說Text'CSV-> new」'產生'Text :: CSV = HASH(0x7fe1b982ccb0)'。 TIL。謝謝! – 2016-06-01 02:05:36

17

如果您使用的是現代Perl,那麼您只需啓用它即可。 5.12 applies strict except for one-liners.由於向後兼容性,它不能被默認。

$ cat strict-safe?.pl 
use 5.012; 
$foo 

$ perl strict-safe\?.pl 
Global symbol "$foo" requires explicit package name at strict-safe?.pl line 2. 
Execution of strict-safe?.pl aborted due to compilation errors. 
10

這是一個哲學問題,而不是「它不會工作」的問題。

首先,perl一直處於「你可以做得不正確,如果你想要」類型的範例。這就是爲什麼有很多perl仇敵在那裏。許多人寧願這種語言總是強迫你寫出好的代碼,但許多快速腳本黑客不想這樣做。試想一下:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";' 

現在,它很容易添加一個「我」在@a的前面,但對於一條線,一次性腳本人並不想這樣做。

二,是的,我認爲大多數CPAN確實需要重寫。

恐怕沒有一個好的答案你會喜歡。

16

那麼,use strict現在是默認的,有點。

由於Perl 5.12.0,如果您需要版本的Perl> = 5.12.0,那麼您的腳本將打開所有向後不兼容的功能,包括嚴格默認。

use 5.12.0; 
use warnings; 

是一樣:

use strict; 
use warnings; 
use feature ':5.12'; 

它沒有被打開更廣泛的,因爲這樣做會破壞人們依靠「只是工作」了很多的腳本。

駝鹿也會自動打開嚴格和警告,當你使用它。因此,如果您執行任何基於Moose的Perl OOP,那麼您也可以在這裏獲得免費通行證。

+0

謝謝提起Mo。。很高興知道。 – kobame 2011-05-19 03:45:23

-2

可以使用common::sense模塊,如果你需要:

use utf8; 
use strict qw(vars subs); 
use feature qw(say state switch); 
no warnings; 
use warnings qw(FATAL closed threads internal debugging pack 
       portable prototype inplace io pipe unpack malloc 
       deprecated glob digit printf layer 
       reserved taint closure semicolon); 
no warnings qw(exec newline unopened);

它減少了內存使用情況。

+0

不幸的是,'common :: sense'不是很常識。沒有任何應該在默認情況下關閉的警告或限制。 – Ether 2011-05-18 21:26:57

+7

'common :: sense'不是。它選擇的警告和限制沒有打開反映了作者的怪癖,而不是良好的做法。尤其是,未能打開嚴格的引用和未定義的警告是在尋求麻煩。至於內存使用聲明,雖然嚴格說來是實際上從未見過的。一旦加載了其他明智的模塊,就會加載嚴格的警告和警告。在實踐中,你會用更多的記憶來結束。最後,作者不是你想要聯繫尋求支持的人。 – Schwern 2011-05-19 06:27:09

+0

@Schwern:它也忘記打開'unicode_strings'。而且一個明確的警告列表意味着你可能已經忘記了一些還不存在的未來事件,比如包警告。最後,你必須延遲直到運行時間的致命錯誤,否則編譯器會在錯誤報告中發生錯誤。 – tchrist 2011-05-19 11:19:52

相關問題