Jaka jest różnica między my ($variableName)
i my $variableName
w Perlu? Co robią nawiasy?
Odpowiedz
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
.
W skrócie: nawiasy 1. zapewniają kontekst listy i 2. rozpowszechniają operatora lub funkcję na wielu wartościach. – Ether
# 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'.) –
# 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. –
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
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";
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.
- 1. Jaka jest różnica między BAREWORD i * BAREWORD w Perlu?
- 2. self.variableName vs. _variableName vs. @sysnthesize variableName
- 3. Jaka jest różnica między pojedynczymi i podwójnymi cudzysłowami w Perlu?
- 4. Jaka jest różnica między "eq" i "= ~" w Perlu?
- 5. Jaka jest różnica między grep i mapą w Perlu?
- 6. dlaczego C# i C++ używają konwencji kodowania _ <variableName>?
- 7. Critique my heap debugger
- 8. Jaka jest różnica między ignorowaniem sygnału i mówieniem mu, aby nie robił nic w Perlu?
- 9. Jaka jest różnica między? : i ||
- 10. Jaka jest różnica między $ i $$?
- 11. GUI My Tkinter jest zbyt ... statyczne?
- 12. foreach my $ var (@list) - $ var jest referencją?
- 13. Co to jest "Just My Code"?
- 14. Jaka jest różnica między = i: = w mysql?
- 15. Jaka jest różnica między! = I =! w Javie?
- 16. Jaka jest różnica między 'i "w PHP
- 17. Jaka jest różnica między! i !! w yaml?
- 18. jaka jest różnica między @ i @@ w module?
- 19. Jaka jest różnica między * i. * W Matlab?
- 20. Jaka jest różnica między | i || w MATLAB?
- 21. Jaka jest różnica między * i * | * w CSS?
- 22. Jaka jest różnica między operatorem zwarć Perla (lub, i) a (||, &&)?
- 23. My R ma wycieki pamięci?
- 24. Perl Tkx, Jaka jest różnica między "button" i "ttk__button"?
- 25. Jaka jest różnica między open() i window.open() w przeglądarce Firefox?
- 26. Jaka jest różnica między szablonem w ZCML i ViewPageTemplateFile
- 27. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 28. Jaka jest różnica między asersem i static_assert?
- 29. Jaka jest różnica między PropertyChangeListener i VetoableChangeListener?
- 30. Jaka jest różnica między Ja i Ja?
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
Pełna, szczegółowa odpowiedź tutaj: [Mini-Tutorial: Scalar vs operator przypisania list] (http://www.perlmonks.org/?node_id=790129). – ikegami