2013-04-22 33 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表示法。

相关问题