Regeln (?) von Parens / Klammern Verwendung in Perl

8

Hat etwas gesucht, konnte aber nichts nützliches finden. Ich habe mich gefragt, ob es eine Übersichtstabelle für Einsteiger gibt, um etwas über die "Regeln" der Verwendung von Klammern / Klammern zu erfahren, speziell die Unterschiede zwischen (), [], {}. Leider, nach meiner Erfahrung, use strict und use warnings sagen mir nicht, ob ich die falschen parens benutze.

Zum Beispiel sind unten die legitimen Codes (b / c sie kamen von Ikegami).

%Vor%

Aber sind diese unten auch echt? Oft ist es schwer genug (für mich) zu wissen, ob es andere Teile (Logik) der Codes sind, die das Problem verursachen. Parens für mich (ein Anfänger) zu sortieren, scheint trivial bis gut zu sein. Jeder Leitfaden zur richtigen Verwendung von Parens ist großartig.

%Vor%     
B Chen 22.04.2013, 17:57
quelle

2 Antworten

6

In Klammern haben Klammern, Klammern und Klammern mehrere Bedeutungen, aber geschweifte Klammern haben wahrscheinlich am meisten.

  • Parens
    • Sortierfolge 2 * 3 + 4 vs. 2 * (3 + 4) aussortieren.
      • Das Abgrenzen von Argumentlisten für Funktionen ist ein Teil davon: join "", 1, 2, 3 vs. join("", 1, 2), 3
      • Surround-Argumentliste des Methodenaufrufs mit dem Pfeiloperator: $foo->bar(1, 2) (wird nicht für leere Argliste benötigt)
    • Erzwingt die Interpretation des vorherigen Barewords als Unterprogrammaufruf. Vergleichen Sie Foo->new und Foo()->new .
    • Rufen Sie coderefs mit dem Pfeil operator auf: $code->()
    • Unterprogrammprototypen sub foo ($$;$%) { ... }
  • Quadratische Klammern
    • Array-Subscript-Operator my @array = 1 .. 5; $array[1]
    • Arrayref-Literale my $aref = [1 .. 5]
  • Curly Zahnspange
    • Blöcke (für do , sub , map , grep , Bedingungen, Schleifenkonstrukte, leere Blöcke, etikettierte Blöcke, ...)
    • Hash-Subscript-Operator $hash{foo}
    • Hashref-Literal my $hashref = { a => 3, b => 2 }
    • Dativblock print { $filehandles[5] } "Hello world"
    • Circumfix-Dereferenzoperatoren @{ $aref } , %{ $hashref } , ...
    • Paketblöcke package Foo { ... }

... und fast alle Zeichen können als Trennzeichen für zitatähnliche Operatoren verwendet werden q// , qq// , qr// , qx// , m// , s/// , tr/// , y/// , was zu interessanten Sachen wie s(foo){bar}g

führt

@{"genotype".($i)} verwendet Curlies für die symbolische Dereferenzierung und Parens (um unnötigerweise die Priorität zu umgehen).

@{$genotype[$i]} verwendet eckige Klammern als Array-Subscript-Operator und Curlies für die Dereferenzierung

$genotype[$i] = [ split (/:/, $original_line[$i])] hat verschiedene Teile: $genotype[$i] und $original_line[$i] verwenden Klammern für Array-Subskriptionen. Die = [ ... ] verwendet Klammern, um eine anonyme arrayref zu erstellen. Die Parens in split(/:/, ...) begrenzen nur die Argumentliste für split (Sortierung der Priorität).

my @genotype = map {[split /:/]} @original_line[6..14] verwendet Klammern als Array-Subskriptoperator in @original_line[6..14] und für ein anonymes Array in [split /:/] . Die Curlies werden verwendet, um einen Block als erstes Argument für map zu bilden.

    
amon 22.04.2013, 18:28
quelle
1

map hat zwei Syntaxen

%Vor%

In beiden Fällen können Parens wie ein normales Sub um die Arcs herum verwendet werden.

%Vor%

Beachten Sie, dass LIST zwar eine leere Liste zurückgeben kann, aber nicht vollständig weggelassen werden kann, wie Sie es für Subs tun können.

%Vor%

ist ein Beispiel für map BLOCK LIST , während

%Vor%

liefert illegal EXPR, aber keine LIST. Hier sind akzeptable Syntaxen:

%Vor%

Wenn der Ausdruck etwas wie (2 + $ _) * 3 war, haben Sie nur diese Optionen:

%Vor%

Wenn du die Parens von letzterem entfernst, landest du mit dem illegalen

%Vor%

Sie können mit +

disambiguieren %Vor%

aber es ist besser, in die map BLOCK LIST -Notation zu wechseln.

    
ikegami 22.04.2013 18:20
quelle