2013-04-22 15 views
8

Zrobiłem kilka wyszukiwania, ale nie mogłem znaleźć nic przydatnego. Zastanawiam się, czy istnieje tabela podsumowująca dla początkujących, aby dowiedzieć się o "zasadach" używania parens/nawiasach, w szczególności różnic między(), [], {}. Niestety, z mojego doświadczenia, use strict i use warnings nie mów mi, czy używam niewłaściwych parens.Reguły (?) Użycia parens/nawiasów w perlu

Na przykład poniższe kody legit (b/c pochodzą z ikegami).

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

Ale czy te poniżej są również uzasadnione? Często jest to wystarczająco trudne (dla mnie), aby wiedzieć, czy to inne części (logika) kodów, które powodują problem. Sortowanie przez parens do mnie (początkującego) wydaje się banalne dla dobrego kodowania. Każdy poradnik jak prawidłowo używać parens będzie świetny.

@{"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

Czy przeczytałeś samouczek dotyczący odsyłaczy? http://perldoc.perl.org/perlreftut.html – mzedeler

+1

Zacznij od [Perl Intro] (http://perldoc.perl.org/perlintro.html), a następnie przeczytaj o [Strukturze danych Perla] (http: // perldoc .perl.org/perldsc.html). –

+0

Większość z tych linków nie mówi konkretnie o używaniu nawiasów/paren, chyba że w moim czytaniu nie zauważyłem ich. Podają przykłady istotne dla konkretnych zastosowań, ale miałem nadzieję uzyskać ogólny widok (jeśli istnieje), zanim przejdę do szczegółów - ogólny widok, np. działa zawsze z nawiasami klamrowymi lub tablicą zawsze z nawiasami kwadratowymi lub zawsze z nawiasami klamrowymi. Odpowiedź Amona stanowi dobre podsumowanie dla początkującego, takiego jak ja. Dziękuje wszystkim. –

Odpowiedz

6

W języku Perl nawiasy, nawiasy klamrowe i pareny mają wiele znaczeń, ale nawiasy klamrowe prawdopodobnie mają najwięcej.

  • Nawiasy zamiast znaku
    • Posortuj pierwszeństwo 2 * 3 + 4 vs. 2 * (3 + 4).
      • Ograniczanie listy argumentów dla funkcji jest tego przykładem: join "", 1, 2, 3 vs.join("", 1, 2), 3
      • Surround lista argument wywołania metody z operatorem strzałką: $foo->bar(1, 2) (nie potrzeba do pustej listą argumentów arglist)
    • Siła interpretacja poprzedniego gołe słowo jako wywołanie procedury. Porównaj Foo->new i Foo()->new.
    • Invoke coderefs z operatorem strzałka: $code->()
    • Podprogram prototypy sub foo ($$;$%) { ... }
  • nawiasach kwadratowych
    • Array indeksie dolnym operator my @array = 1 .. 5; $array[1]
    • arrayref literały my $aref = [1 .. 5]
  • nawiasach klamrowych
    • Blocks (dla do, sub, map, grep, warunkowe, pętle konstruktów gołe bloki, oznaczonych bloków, ...)
    • Hash indeks operatora $hash{foo}
    • hashref dosłowne my $hashref = { a => 3, b => 2 }
    • Celownik blok print { $filehandles[5] } "Hello world"
    • Operatory dereferencji Circumfix @{ $aref }, %{ $hashref }, ...
    • bloki pakietów package Foo { ... }

... i prawie wszystkie znaki mogą być używane jako ograniczniki ofertowe podobny operatorów q//, qq//, qr//, qx//, m//, s///, tr///, y///, co prowadzi do ciekawych rzeczy jak s(foo){bar}g


@{"genotype".($i)} używa curlies dla symbolicznych dereferencji, a parens (niepotrzebnie) porządkuje pierwszeństwo.

@{$genotype[$i]} wykorzystuje wsporniki jak operator tablicy indeksem i nawiasów klamrowych do dereferencing

$genotype[$i] = [ split (/:/, $original_line[$i])] ma różne części: $genotype[$i] i $original_line[$i] nawiasach w tablicy indeksowanie. = [ ... ] używa nawiasów do utworzenia anonimowego arrayref. Parens w split(/:/, ...) ograniczają tylko listę argumentów dla split (sortowanie pierwszeństwa).

my @genotype = map {[split /:/]} @original_line[6..14] używa nawiasów jako operatora tablicy tablicowej w @original_line[6..14], a dla anonimowej tablicy w [split /:/]. Curlies są używane do utworzenia bloku jako pierwszego argumentu do map.

+1

Parens może być również używany jako operacja, w której oczekiwane jest wyrażenie ('@a =();', '$ count =() = f();') – ikegami

+0

Podoba mi się, jak nie twierdziłeś, że parens tworzyć listy. – ikegami

+0

Curlies są również używane do ograniczania zmiennych w interpolacji (np. '' $ {Foo} bar "'). W rzeczywistości możesz to zrobić również poza interpolacją (np. '$ A = $ foo;'), chociaż nie ma na to żadnego powodu. – ikegami

1

map dwa składnie

map BLOCK LIST 
map EXPR, LIST 

W obu przypadkach, mogą być stosowane nawiasy wokół argumentach jak normalny sub.

map(BLOCK LIST) 
map(EXPR, LIST) 

Jedna uwaga jest taka, że ​​chociaż LISTA może zwrócić pustą listę, nie można jej całkowicie pominąć, tak jak można dla subs.


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

jest przykładem map BLOCK LIST, natomiast

map([split /:/]) 

nielegalnie zapewnia WYRAŻ, ale nie listy. Oto dopuszczalne składnie:

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

Jeśli wyrażenie było coś jak (2 + $ _) * 3, tylko masz te opcje:

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

Jeśli usuniesz parens z że wreszcie koniec z nielegalnym

map(2+$_) 

można disambiguate użyciu +

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

, ale lepiej jest zmienić notację na map BLOCK LIST.