2010-01-24 4 views
22

Was ist der Unterschied zwischen my ($variableName) und my $variableName in Perl? Was zu den Klammern?

+1

Interessante Perl-Mönche antworten [hier] (http://www.perlmonks.org/?node_id=693666), die schließlich die Verwendung von Parens in Deklarations-Zuweisungen als ein Ende um plumpen Operationspriorität kocht. – ruffin

+0

Volle, detaillierte Antwort hier: [Mini-Tutorial: Scalar gegen List Assignment Operator] (http://www.perlmonks.org/?node_id=790129). – ikegami

Antwort

19

Der wichtige Effekt ist, wenn Sie die Variable in der gleichen Zeit zu initialisieren, dass Sie es erklären:

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

Das andere Mal ist es wichtig ist, ist, wenn Sie mehrere Variablen zu deklarieren.

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 

Die letzte Anweisung erhalten Sie einen Fehler, wenn Sie use strict geben.

+10

Also im Wesentlichen: die Klammern 1. bieten Listenkontext und 2. verteilen den Operator oder die Funktion über mehrere Werte. – Ether

+2

# 2 ist technisch falsch und möglicherweise irreführend. Es ist insofern falsch, als die Deklaration mit den Parens funktioniert, indem eine lexikalische Liste statt eines lexikalischen Skalars definiert wird. Es ist irreführend, dass ein Anfänger "die Klammern ... lesen kann, verteilt den Operator oder die Funktion über mehrere Werte" und erwartet, dass '($ x, $ y) = (1, 2) + 3' die Werte 4 zu' zuordnen $ x' und 5 bis '$ y', indem" + Operator über mehrere Werte verteilt wird ". (In Wirklichkeit weist diese Anweisung 5 $ x und nichts $ y zu.) –

+3

# 1 ist auch nicht vollständig korrekt. Die Parens auf der linken Seite einer Zuweisung stellen einen Listenkontext zur Verfügung, was jedoch nicht bedeutet, dass sie einen Listenkontext überall sonst bereitstellen. –

4

Weitere Informationen zum Operator my finden Sie unter perdoc perlsub. Hier ist ein kleiner Auszug:

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

Als andere Antwort und Kommentare erklären Verwendung von Klammern Listenkontext auf die Variable bereitstellen. Unten finden Sie ein Code-Snippet, das mit der Perl-Funktion split weitere Erläuterungen bietet.

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

Die kurze Antwort ist, dass Klammern Kraft Listenkontext, wenn auf der linken Seite eines = verwendet.

Jeder der anderen Antworten weist auf einen speziellen Fall hin, in dem dies einen Unterschied macht. Wirklich, Sie sollten perlfunc lesen, um eine bessere Vorstellung davon zu bekommen, wie sich Funktionen anders verhalten, wenn sie im Listenkontext im Gegensatz zum skalaren Kontext aufgerufen werden.