2009-08-18 97 views
4

首先,有沒有人有Perl特殊變量的綜合列表?對Perl特殊變量有什麼好的做法?

其次,有沒有更容易使用它們的任務?我總是將$/設置爲一次讀入文件,並且$|自動刷新緩衝區,但我不確定其他人。

第三,應該使用Perl的特殊變量,還是應該在編碼時更加明確。就我個人而言,我是使用特殊變量來操縱代碼行爲的迷,但我聽到其他人認爲它只是混淆了事情。

回答

5

1)至於哪些我經常使用:

  • $!是典型的IO錯誤處理

  • $ @爲EVAL錯誤處理調用錯誤設計庫(如數據庫的)時,其編碼器還不夠體貼體面的錯誤處理代碼比其他「死」

  • $ _對於map/grep塊,儘管我100%同意上面的海報,將它用於常規代碼並不是一個好習慣。

  • $ |衝廁緩衝區

2)至於使用標點符號與英文名字,我來接上面雖然同反駁也適用於任何人爭辯說,有使用英文名字沒有好處馬克·布林的回答。

「如果你正在使用Perl,你顯然不會選擇它的新手可讀性」

馬克,我發現事實並非總是(或者說幾乎沒有)真。然後,我的99%的Perl經驗是爲大公司編寫產品Perl代碼,其中90%是完整的應用程序而不是10行的黑客腳本,因此我的分析可能不適用於其他領域。原因這種思想作爲馬克的是錯誤的是:

  • 就因爲我是一個Perl非新手(說得客氣一點),有些小白分析師聘請一年前 - 或外包「天才」 - 是可能不會。你可能不想再混淆他們。 「如果代碼難寫,應該很難閱讀」,這在專業開發人員的任何語言的良好態度清單中都不是很高。

  • 當我在凌晨2點,半睡半醒,解決生產問題時,我真的不想依賴我已經近乎瞎眼的能力區分$!和$ |。特別是在前面提到的「天才」編寫的代碼中,他們可能不知道他們中的哪一個使用並切換它們。

  • 當我讀通過一個人誰是咳嗽未完成代碼「重組」 咳嗽出公司在一年前,我寧願專注於扭曲邏輯的複雜性比的可讀性標點符號湯。

19

它們都記錄在perlvar

請注意,長名稱只有在您首先使用use English qw(-no_match_vars);時纔可用。

+0

+1有時他們可能會引起混淆,但我離回答不會超過3秒鐘。 – 2009-08-22 04:38:29

4

我使用最多的三個是$_,@_$!

我喜歡用$_通過陣列循環時,檢索參數(如由Motti指出的,這實際上是@_)或執行的置換:

實施例1.1:

foreach (@items) 
{ 
    print $_; 
} 

實施例1.2:

my $prm1 = shift; # implicit use of @_ or @ARGV depending on context 

實施例1.3:

s/" "/""/ig; # implicit use of $_ 

我用$!的情況是這樣的:

例2.1:

open(FILE, ">>myfile") || die "Error: $!"; 

我不同意,雖然,它使代碼更加混亂的人不熟悉Perl。但混淆其他人是瞭解語言的樂趣之一! :)

+2

個人而言,我討厭使用$ _並且儘可能避免使用它(比如foreach my $ item(@items)),但$!絕對有用。 – Powerlord 2009-08-18 16:48:24

+2

我是'$ _'的忠實粉絲,並一直使用它。 – Justin 2009-08-18 16:49:54

+6

查看open的三個參數形式,包含詞法文件句柄:打開我的$ file_handle,'>>','myfile'或者試圖打開[myfile]時死於「Fiery death:$!」' – Telemachus 2009-08-18 16:52:20

2

我使用的典型的是$_, @_, @ARGV, $!, $/。其他人我很重視。

布拉德指出,[email protected]也是一個很常見的變量。 (來自eval()的錯誤值)。

+0

我會將'$ @'添加到列表中。 – 2009-08-21 16:51:34

7

永遠記得local'對標點變量進行修改。一些標點符號是有用的,其他的不應該使用。例如,不應使用$[(它會更改數組的基本索引,因此local $[ = 1;將導致1引用列表或數組中的第一項)。其他人喜歡$"是iffy。您必須平衡不必手動執行加入的有用性。例如,哪些更容易理解?

local $" = " :: ";    #" 
my $s = "@a/@b/@c\n"; 

my $sep = " :: "; 
my $s = join("/", join($sep, @a), join($sep, @a), join($sep, @a)) . "\n"; 

my $s = join("/", map { join " :: ", @$_ }, \(@a, @b, @c)) . "\n"; 
0

我說使用他們 - 如果你正在使用Perl,你顯然不會選擇它的新手可讀性。任何超過臨時開發人員可能都會打開瀏覽器/參考窗口,並且在一個窗口中瀏覽perlvar聯機幫助頁面可能比查找全局或外部變量的定義(以及分配!)更困難。舉個例子,我剛剛遇到的新功能於5.10.x命名的捕獲緩衝區:

/^(?<myName>.*)$/; 
# and later 
my $capture = %+{'myName'}; 

並找出發生了什麼事情並不比進入parlvar/perlre,讀一點點任何困難。

我寧願在無證代碼中發現一堆古怪的特殊變量,而不是一堆古怪的算法在無證代碼中。

相關問題