12

いくつかの検索を行いましたが、有用なものが見つかりませんでした。初心者が括弧/括弧を使用する「ルール」、特に ()、[]、{} の違いについて学ぶための要約表があるかどうか疑問に思っていました。残念ながら、私の経験では、間違った括弧を使用しても教えuse strictuse warningsくれません。

たとえば、以下は正当なコードです (b/c それらは池上から来ました)。

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

しかし、これらも合法ですか?多くの場合、問題の原因がコードの他の部分 (ロジック) であるかどうかを知ることは (私にとっては) 難しいことです。私(初心者)にとって括弧をソートすることは、良いコーディングにとって些細なことのように思えます。括弧を適切に使用する方法に関するガイドは素晴らしいでしょう。

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

2 に答える 2

12

Perl では、角かっこ、中かっこ、およびかっこにはすべて複数の意味がありますが、中かっこがおそらく最も多くの意味を持ちます。

  • パレンズ
    • 優先順位と を並べ替え2 * 3 + 4ます2 * (3 + 4)
      • 関数の引数リストを区切ることは、これのサブケースです: join "", 1, 2, 3vs.join("", 1, 2), 3
      • メソッド呼び出しの引数リストを矢印演算子で囲みます: $foo->bar(1, 2)(空の arglist の場合は不要)
    • 前のベアワードをサブルーチン呼び出しとして強制的に解釈します。とを比較Foo->newしてくださいFoo()->new
    • アロー演算子を使用して coderef を呼び出します。$code->()
    • サブルーチンのプロトタイプsub foo ($$;$%) { ... }
  • 角括弧
    • 配列添え字演算子my @array = 1 .. 5; $array[1]
    • Arrayref リテラルmy $aref = [1 .. 5]
  • 中括弧
    • ブロック ( dosubmapgrep条件文、ループ構造、ベア ブロック、ラベル付きブロックなど)
    • ハッシュ添え字演算子$hash{foo}
    • ハッシュリファレンス リテラルmy $hashref = { a => 3, b => 2 }
    • 与格ブロックprint { $filehandles[5] } "Hello world"
    • 周囲参照逆参照演算子@{ $aref }, %{ $hashref }, ...
    • パッケージ ブロックpackage Foo { ... }

…そして、ほぼすべての文字を引用符のような演算子の区切り文字として使用できますq//, qq//, qr//, qx//, m//, s///,tr///y///ような興味深いものにつながりますs(foo){bar}g


@{"genotype".($i)}シンボリック逆参照にカーリーを使用し、(不必要に) 優先順位を整理するために括弧を使用します。

@{$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ます。

于 2013-04-22T18:28:41.877 に答える
2

map2 つの構文があります

map BLOCK LIST
map EXPR, LIST

どちらの場合も、通常のサブルーチンのように、引数の周りに括弧を使用できます。

map(BLOCK LIST)
map(EXPR, LIST)

注意すべきことの 1 つは、LIST は空のリストを返すことができますが、subs の場合のように完全に省略することはできないということです。


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表記に切り替えたほうがいいです。

于 2013-04-22T18:20:22.463 に答える