2010-02-26 6 views

Antwort

25

Falls Sie die Argumente verketten möchten, verwenden die "." Betreiber oder join:

my $err = $soap_response->code. " ". $soap_response->string. "\n"; 
my $err = join '', $soap_response->code, " ", $soap_response->string, "\n"; 

Weiter Deshalb Perl Sie Warnungen gibt.

Sie ordnen einer Skalarvariablen $err zu, und die rechte Seite der Zuweisung wird im skalaren Kontext ausgewertet.

Binär "," ist der Komma-Operator. Im skalaren Kontext wertet es sein linkes Argument im void-Kontext aus, wirft diesen Wert weg, wertet dann sein rechtes Argument im skalaren Kontext aus und gibt diesen Wert zurück.

Das Auswerten einer Variablen oder einer Konstanten und das Wegwerfen dieses Werts ist nutzlos. Und Perl warnt dich davor.

FYI: Ein weiteres mögliches Problem mit Ihrem Code:

my $err = $soap_response->code, " ", $soap_response->string, "\n"; 

Die Zuordnung hat eine höhere Priorität, so dass ist:

(my $err = $soap_response->code), " ", $soap_response->string, "\n"; 

Perl operators and precedence See und die Comma operator für weitere Informationen.

+2

Große Antwort. Aber "das richtige Argument" ist ein wenig mehrdeutig. Es weist den falschen Wert zu und nicht den richtigen :).Versuchen Sie vielleicht, "am weitesten rechts" oder "endgültig" oder "zuletzt" oder so etwas. – daotoad

+1

Ich würde diese Antwort wirklich besser finden, wenn sie die Erwähnung des Verkettungsoperators als "das ist, was Sie meinten" enthielt. – darch

+1

Dies ist eine bessere Erklärung für das, was schief gelaufen ist, aber codaddict hat eine bessere Lösung. 'Join' ist hier einfach zu viel. Was er wirklich wollte, war der Verkettungsoperator '.'. – cjm

16

Ich denke, man die String-Stücke verketten wollte die gesamte Fehlermeldung zu bilden, so dass Sie den Punkt statt Komma verwenden müssen:

my $err = $soap_response->code. " ". $soap_response->string. "\n"; 
+0

'" $$ soap_response {code} $$ soap_response {string} \ n "' – ephemient

+3

@ephemient: Das ist nicht das Gleiche wie der ursprüngliche Code. Methodenaufrufe sind keine Hash-Lookups (selbst wenn die Methode nur einen Hash-Lookup durchführt, könnte sich dies in der Zukunft ändern). – cjm

+0

@cjm Das sind keine Methodenaufrufe, probieren Sie es selbst aus. '$$ _ {key}' ist '$ {$ _} {key}' ist '$ _-> {key}', außer dass letzteres ein wenig mehr Arbeit ist, um in eine Zeichenkette zu interpolieren. 'perl -e '$ _ = {Schlüssel => 1}; Drucken $$ _ {Schlüssel}, $ {$ _} {Schlüssel}, $ _-> {Schlüssel} ''==> 111 – ephemient

Verwandte Themen