2010-01-24 8 views
22

Jaka jest różnica między my ($variableName) i my $variableName w Perlu? Co robią nawiasy?

+1

Interesujący mnisi z Perla odpowiadają [tutaj] (http://www.perlmonks.org/?node_id=693666), który w ostateczności sprowadza stosowanie paren w zadaniach deklaracji jako końcowym biegu bez precedensu. – ruffin

+0

Pełna, szczegółowa odpowiedź tutaj: [Mini-Tutorial: Scalar vs operator przypisania list] (http://www.perlmonks.org/?node_id=790129). – ikegami

Odpowiedz

19

Ważnym efektem jest, kiedy zainicjować zmienną w tym samym czasie, które deklarują go:

my ($a) = @b; # assigns $a = $b[0] 
my $a = @b;  # assigns $a = scalar @b (length of @b) 

Innym razem jest to ważne jest, kiedy zadeklarować kilka zmiennych.

my ($a,$b,$c); # correct, all variables are lexically scoped now 
my $a,$b,$c; # $a is now lexically scoped, but $b and $c are not 

Ostatnie oświadczenie spowoduje błąd, jeśli uzyskasz use strict.

+10

W skrócie: nawiasy 1. zapewniają kontekst listy i 2. rozpowszechniają operatora lub funkcję na wielu wartościach. – Ether

+2

# 2 jest technicznie niepoprawny i potencjalnie wprowadza w błąd. Błędne jest to, że sposób, w jaki deklaracja z parens działa, definiuje listę leksykalną, a nie leksykalny skalar. Wprowadzanie w błąd polega na tym, że początkujący może czytać "nawiasy ... rozdzielają operatora lub funkcję na wiele wartości" i oczekują '($ x, $ y) = (1, 2) + 3', aby przypisać wartości 4 do' $ x' i 5 do '$ y' przez" dystrybucję operatora + dla wielu wartości ". (W rzeczywistości instrukcja ta przypisuje 5 do '$ x' i nic do' $ y'.) –

+3

# 1 nie jest całkowicie poprawny. Pareny po lewej stronie przypisania zapewniają kontekst listy, ale to nie znaczy, że zapewniają kontekst listy wszędzie indziej. –

4

Proszę spojrzeć na perdoc perlsub, aby uzyskać więcej informacji na temat operatora my. Oto mały fragment:

Synopsis:

my $foo;   # declare $foo lexically local 
    my (@wid, %get); # declare list of variables local 
    my $foo = "flurp"; # declare $foo lexical, and init it 
    my @oof = @bar;  # declare @oof lexical, and init it 
    my $x : Foo = $y; # similar, with an attribute applied 
1

Jako inna odpowiedź i komentarze wyjaśniają użycia nawiasów zapewnienia kontekście listy do zmiennej. Poniżej znajduje się fragment kodu, który zawiera więcej objaśnień przy użyciu funkcji perl split.

use strict; 

my $input = "one:two:three:four"; 

# split called in list context 
my ($out) = split(/:/,$input); 
# $out contains string 'one' 
#(zeroth element of the list created by split operation) 
print $out,"\n"; 

# split called in scalar context 
my $new_out = split(/:/,$input); 
# $new_out contains 4 (number of fields found) 
print $new_out,"\n"; 

4

Krótka odpowiedź jest taka, że ​​nawiasy kontekst lista siła gdy używany na lewym boku z =.

Każda z pozostałych odpowiedzi wskazuje konkretny przypadek, w którym to robi różnicę. Naprawdę, powinieneś przeczytać perlfunc, aby lepiej zrozumieć, jak funkcje działają inaczej, gdy są wywoływane w kontekście listy, w przeciwieństwie do kontekstu skalarnego.

Powiązane problemy