2010-03-12 10 views
26

Questo codice fa scattare la denuncia di seguito:Perché Perl si lamenta che "L'uso della divisione implicita in @_ è deprecato"?

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

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

Quando eseguo il codice, Perl lamenta che "Use of implicit split to @_ is deprecated". Non ho davvero alcun "contesto" per il problema, quindi mi aspetto che aiuti a spiegare cosa c'è che non va nel codice .

+1

Sei sicuro che si deve messaggio di errore tutto lì? Il mio perl mi dice anche il problema nella linea 6. Poiché la divisione è sulla linea 6, leggere i documenti di divisione mi dice il problema nel secondo paragrafo. :) –

risposta

33

Si sta utilizzando split in contesto scalare e in contesto scalare si divide nell'array @_. Perl ti avverte che potresti aver appena stroncato @_. (Vedere perldoc split per ulteriori informazioni.)

Per ottenere il numero di campi, utilizzare questo codice:

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

o

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

Nota: Il modulo a tre argomenti di split() è necessario perché senza specificare un limite, split dividerebbe solo un pezzo (uno in più di quello necessario in l'assegnazione).

+0

O per rimanere concisi, 'my $ num_of_item =() = split (/ \ s + /, $ s)' – mob

+0

@mobrule: il tuo commento è tardivo :-) –

+1

Questo metodo con() non funziona per me ; $ num_of_item viene impostato su 1. –

10

Dalle split documentazione:

In un contesto scalare, restituisce il numero di campi trovati. Nel contesto scalare e vuoto si divide nell'array @_. L'uso della divisione in contesto scalare e vuoto è deprecato, tuttavia, poiché elimina i propri argomenti di subroutine.

Quindi, dal momento che si sta utilizzando in un contesto scalare, si divide in @_ matrice, che è un uso sconsigliato. (Deve fare lo split, dal momento che romperebbe il vecchio codice aspettandosi di dividerlo in @_ - non c'è modo di aggirare l'avviso senza assegnarlo a un array temporaneo, per quanto ne so. Eugene Y ha questo esplicitamente nella sua risposta.)

15

Let diagnostics fornire maggiori informazioni:

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; 

L'uso della divisa implicito a @_ è deprecato

(D deprecato, sintassi W) si fa un sacco di lavoro per il compilatore quando si blocca la lista degli argomenti di una subroutine, quindi è meglio se si assegnano esplicitamente i risultati di una divisione() a una matrice (o lista).

Un modo migliore per ottenere informazioni diagnostiche da riga di comando:

perl -Mdiagnostics my_program.pl 
+1

'use diagnostics' è un vero bacon-saver quando si tratta di ricevere messaggi di avvertimento che non capisci – mob

+1

@mobrule: puoi anche semplicemente cercare questi messaggi in' perldoc perldiag' (http://perldoc.perl.org/perldiag.html) per la spiegazione più lunga. – Ether

+1

Oppure invia le avvertenze attraverso 'splain' (http://perldoc.perl.org/splain.html). – ephemient

Problemi correlati