perl中parens/bracket使用的规则(?)

B C*_*hen 12 perl square-bracket curly-brackets

做了一些搜索但找不到任何有用的东西.我想知道是否有一个摘要表,供初学者了解使用parens/bracket的"规则",特别是(),[],{}之间的差异.不幸的是,根据我的经验,use strictuse warnings没有告诉我,如果我使用错误的parens.

例如,下面是合法代码(b/c来自ikegami).

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

但这些下面也是合法的吗?通常情况下(对我来说)知道代码的其他部分(逻辑)是否导致问题是很困难的.通过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]
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 11

在Perl中,括号,括号和parens都有多种含义,但花括号可能最多.

  • 括号
    • 排除优先级2 * 3 + 42 * (3 + 4).
      • 定义函数的参数列表是这个的一个子例:join "", 1, 2, 3vs.join("", 1, 2), 3
      • 使用箭头操作符调用方法调用的环绕参数列表:( $foo->bar(1, 2)空arglist不需要)
    • 强制解释前一个裸字作为子程序调用.比较Foo->newFoo()->new.
    • 使用箭头操作符调用coderefs: $code->()
    • 子程序原型 sub foo ($$;$%) { ... }
  • 方括号
    • 数组下标运算符 my @array = 1 .. 5; $array[1]
    • Arrayref文字 my $aref = [1 .. 5]
  • 大括号
    • 块(do,sub,map,grep,条件,循环结构,裸块,标记块,...)
    • 哈希下标运算符 $hash{foo}
    • Hashref文字 my $hashref = { a => 3, b => 2 }
    • Dative块 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]} 使用括号作为数组下标运算符,并使用curlies进行解除引用

$genotype[$i] = [ split (/:/, $original_line[$i])]有各种各样的部分:$genotype[$i]$original_line[$i]使用括号进行数组下标.在= [ ... ]使用括号使一个匿名数组引用.parens split(/:/, ...)只是界定参数列表split(排除优先级).

my @genotype = map {[split /:/]} @original_line[6..14]使用括号作为数组下标运算符@original_line[6..14],并使用括号作为数组下标运算符[split /:/].curlies用于形成一个块作为第一个参数map.

  • 我喜欢您没有声称parens创建列表的方式。 (3认同)