2010-02-26 7 views

Respuesta

25

En caso de que quiera para concatenar los argumentos, el uso el operador "." o join:

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

siguiente es la razón por Perl le da advertencias.

Está asignando a una variable escalar $err, y el lado derecho de la asignación se evalúa en contexto escalar.

binario "," es el operador coma. En el contexto escalar, evalúa su argumento de la izquierda en el contexto vacío, descarta ese valor, luego evalúa su argumento correcto en contexto escalar y devuelve ese valor.

Evaluación de una variable o una constante y tirar que el valor de distancia es inútil. Y Perl te advierte sobre esto.

FYI: Otro posible problema con su código:

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

La asignación tiene mayor preferencia por lo que es:

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

Ver Perl operators and precedence y la Comma operator para más información.

+2

Gran respuesta. Pero "el argumento correcto" es un poco ambiguo. Está asignando el valor incorrecto y no el correcto :).Pruebe, tal vez, 'más a la derecha' o 'final' o 'último' o algo así. – daotoad

+1

Realmente me gustaría esta respuesta si incluyera mención del operador de concatenación como "esto es lo que quería decir". – darch

+1

Esta es una mejor explicación de lo que salió mal, pero codaddict tiene una mejor solución. 'join' es exagerado aquí. Lo que realmente quería era el operador de concatenación, '.'. – cjm

16

supongo que quería para concatenar los trozos de cuerda para formar la totalidad del mensaje de error, por lo que tendrá que utilizar el punto en lugar de coma:

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

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

+3

@ephemient: Eso no es en absoluto lo mismo que el código original. Las llamadas a métodos no son búsquedas hash (incluso si el método solo hace una búsqueda hash, podría cambiar en el futuro). – cjm

+0

@cjm Esas no son llamadas de método, pruébalo tú mismo. '$$ _ {key}' es '$ {$ _} {key}' es '$ _-> {key}', excepto que este último es un poco más de trabajo para interpolar en una cadena. 'perl -e '$ _ = {clave => 1}; impresión $$ _ {clave}, $ {} $ _ {clave}, {$ _-> clave} ' '==> 111 – ephemient

Cuestiones relacionadas