2013-04-22 10 views
8

做了一些搜索但找不到任何有用的東西。 我想知道是否有一個類似的摘要表,供初學者瞭解使用parens /括號的「規則」,特別是(),[],{}之間的差異。 不幸的是,以我的經驗,use strictuse warnings不告訴我,如果我使用了錯誤的parens。perl中的parens /括號內使用規則(?)

例如,以下是合法代碼(它們來自ikegami的b/c)。

@{"genotype".($i)} 
@{$genotype[$i]} 
$genotype[$i] = [ split (/:/, $original_line[$i])] 
my @genotype = map {[split /:/]} @original_line[6..14] 

但是下面這些也是合法嗎?通常情況下(對我而言)知道是否導致問題的代碼的其他部分(邏輯)足夠困難。通過parens對我(初學者)進行排序對於良好的編碼來說似乎微不足道。任何關於如何正確使用parens的指南都會很棒。

@{"genotype".[$i]} 
@["genotype".($i)] 
@("genotype".($i)) 
@{$genotype($i)} 
@[$genotype($i)] 
$genotypes[$i] = (split (/:/, $original_line[$i])) 
my @genotype = map ([split /:/]) @original_line[6..14] 
+1

您是否閱讀過參考指南? http://perldoc.perl.org/perlreftut.html – mzedeler 2013-04-22 17:59:46

+1

從[Perl Intro](http://perldoc.perl.org/perlintro.html)開始,然後閱讀[Perl數據結構](http:// perldoc .perl.org/perldsc.html)。 – 2013-04-22 18:00:10

+0

大多數這些鏈接沒有具體談論括號/ parens的用法,除非我在閱讀中錯過了它們。它們提供了與特定用途相關的示例,但是我希望在具體細節之前首先獲得一般視圖(如果存在的話) - 一般視圖(例如,函數總是用大括號或數組總是帶方括號或總是用大括號括起來。 Amon的答案對於像我這樣的初學者來說確實提供了一個很好的總結。謝謝大家。 – 2013-04-22 18:41:24

回答

6

在Perl中,括號,括號和parens都有多重含義,但大括號可能是最多的。

  • 的括號
    • 搜索結果排序優先2 * 3 + 42 * (3 + 4)
      • 爲函數定界參數列表是這樣的子情形:join "", 1, 2, 3與箭頭操作方法調用的join("", 1, 2), 3
      • 環繞參數列表:$foo->bar(1, 2)(不需要空洞的arglist)以前的裸字作爲子程序調用的
    • 力解釋。比較Foo->newFoo()->new
    • 調用coderefs箭頭操作:$code->()
    • 子程序原型sub foo ($$;$%) { ... }
  • 方括號
    • 數組下標操作my @array = 1 .. 5; $array[1]
    • 數組引用文字my $aref = [1 .. 5]
  • 大括號
    • 塊(對於dosubmapgrep,條件,循環結構,裸塊,標記塊,...)
    • 哈希標操作$hash{foo}
    • Hashref字面my $hashref = { a => 3, b => 2 }
    • 與格塊print { $filehandles[5] } "Hello world"
    • Circumfix取消運算符@{ $aref },%{ $hashref },...
    • 程序包程序塊package Foo { ... }

...幾乎所有字符都可以用作分隔符報價般的運營商q//qq//qr//qx//m//s///tr///y///,導致有趣的東西,如s(foo){bar}g


@{"genotype".($i)}使用curlies進行符號解引用,並且parens(不需要)對優先進行排序。

@{$genotype[$i]}使用括號作爲數組下標操作者,和花括號解引用

$genotype[$i] = [ split (/:/, $original_line[$i])]具有各個部分:$genotype[$i]$original_line[$i]數組下標括號使用。 = [ ... ]使用括號來創建一個匿名數組參考。 split(/:/, ...)中的元素只是爲split分隔參數列表(整理優先級)。

my @genotype = map {[split /:/]} @original_line[6..14]使用括號作爲@original_line[6..14]中的數組下標運算符,以及[split /:/]中的匿名數組。捲曲用於形成一個塊作爲map的第一個參數。

+1

Parens也可以用作一個無操作的表達式('@a =();','$ count =()= f();') – ikegami 2013-04-22 19:06:48

+0

我喜歡你沒有聲稱那個parens創建列表。 – ikegami 2013-04-22 19:07:10

+0

Curlies也用於分隔插值中的變量(例如'「$ {foo} bar」')。實際上,你也可以在插值之外做到這一點(例如'$ a = $ foo;'),儘管沒有任何理由這麼做。 – ikegami 2013-04-22 19:08:18

1

map具有兩種語法

​​

在兩種情況下,括號可以圍繞ARGS可以使用像正常子。值得注意的

map(BLOCK LIST) 
map(EXPR, LIST) 

的一件事是,雖然列表可以返回一個空列表,它不能完全,你可以爲潛艇省略。


map { [split /:/] } @original_line[6..14] 

map BLOCK LIST一個例子,而

map([split /:/]) 

非法提供EXPR,但沒有LIST。以下是可接受的語法:

map({ [split /:/] } @original_line[6..14]) 
map { [split /:/] } @original_line[6..14] 
map([split /:/], @original_line[6..14]) 
map [split /:/], @original_line[6..14] 

如果表達類似(2 + $ _)* 3,你只有這些選項:

map({ (2+$_)*3 } ...) 
map { (2+$_)*3 } ... 
map((2+$_)*3, ...) 

如果您從該括號最後,你結束了非法

map(2+$_) 

您可以使用歧義+

map +(2+$_)*3, ... 

但最好切換到map BLOCK LIST表示法。