2010-03-12 14 views
26

Este código desencadena la queja a continuación:¿Por qué Perl se queja de que "el uso de división implícita en @_ está en desuso"?

#!/usr/bin/perl 
use strict; 
use warnings; 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

Cuando ejecuto el código, Perl se queja de que "Use of implicit split to @_ is deprecated". Realmente no tengo "contexto" para el problema, por lo que espero que ayude a explicar qué pasa con el código.

+1

¿Estas seguro que usted tiene que mensaje de error entera allí? Mi perl también me dice el problema en la línea 6. Como la división está en la línea 6, leer los documentos divididos me dice el problema en el segundo párrafo. :) –

Respuesta

33

Está utilizando split en contexto escalar, y en contexto escalar se divide en la matriz @_. Perl te advierte que es posible que acabes de matar a @_. (Ver perldoc split para obtener más información.)

para obtener el número de campos, utilice este código:

my @items = split(/\s+/, $s); 
my $num_of_item = @items; 

o

my $num_of_item =() = split /\s+/, $s, -1; 

Nota: La forma de tres argumentos de split() es necesario porque sin especificar un límite, la división solo se dividiría en una sola pieza (una más de la necesaria en la asignación).

+0

O para ser conciso, 'my $ num_of_item =() = división (/ \ s + /, $ s)' – mob

+0

@mobrule: tu comentario es tardío :-) –

+1

Ese método con el() no funciona para mí ; $ num_of_item se establece en 1. –

10

De los documentos split:

En contexto escalar, devuelve el número de campos que se encuentran. En contexto escalar y vacío, se divide en @_ array. Sin embargo, el uso de la división en el contexto escalar y vacío está en desuso, ya que corta los argumentos de subrutina.

lo tanto, ya se está usando en el contexto escalar, se divide en la matriz @_, que es un uso obsoleto. (Tiene que hacer la división, ya que rompería el viejo código esperando que se divida en @_ - de ninguna manera alrededor de la advertencia sin asignar a una matriz temporal, hasta donde yo sé. Eugene Y tiene esto explícitamente en su respuesta.)

15

Vamos diagnostics proporcionan más información:

use strict; 
use warnings; 
use diagnostics; # comment this out when you are done debugging 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

El uso de división implícita a @_ está en desuso

(D obsoleta, la sintaxis W) Se hace un montón de trabajo para el compilador cuando Bloquea la lista de argumentos de una subrutina, por lo que es mejor si asigna los resultados de una división() explícitamente a una matriz (o lista).

Una mejor manera de obtener información de diagnóstico es de la línea de comandos:

perl -Mdiagnostics my_program.pl 
+1

'use diagnostics' es un verdadero ahorro de bacon cuando se trata de recibir mensajes de advertencia que no entiendes – mob

+1

@mobrule: también puedes simplemente buscar estos mensajes en' perldoc perldiag' (http://perldoc.perl.org/perldiag.html) para la explicación más larga. – Ether

+1

O canalice las advertencias a través de 'splain' (http://perldoc.perl.org/splain.html). – ephemient

Cuestiones relacionadas