2014-10-17 11 views
6

ho:perl sorta di matrice/elenco utilizzando una virgola o un punto per concatenazione di stringhe

#!c:\Dwimperl\perl\bin\perl.exe 

use strict; 
use warnings; 

# define an array 
my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort @letters , "\n"; 

Uscite: abcdePress any key to continue . . . Perché non c'è ritorno linea?

poi ho provato ad utilizzare il periodo di concatenazione dell'operatore:

#!c:\Dwimperl\perl\bin\perl.exe 

use strict; 
use warnings; 

# define an array 
my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort @letters . "\n"; 

uscita: 5 Press any key to continue . . .

Perché il \n lavoro qui, ma restituisce la lunghezza dell'array?

Qualsiasi riferimento alla documentazione ufficiale potrebbe essere d'aiuto.

+0

Dai un'occhiata alla: http://perldoc.perl.org/perlport.html#Newlines credo che è quello che state cercando. O forse anche: http://perldoc.perl.org/functions/say.html – TomDillinger

risposta

9

Quando si esegue

print sort @letters . "\n"; 

cosa si sta realmente facendo sta valutando @letters in contesto scalare e aggiungendo una nuova riga, e quindi l'ordinamento tale matrice. Dal momento che la matrice è di lunghezza 5, si ottiene il numero 5.

Prova in questo modo:

my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort(@letters . "\ntest"); 

e sarete in uscita:

5 
test 

Il comportamento di sort non è definito in contesto scalare. Così si non si può fare:

my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort(@letters) . "\n"; 
# This produces no output 

Quello che probabilmente vuole fare è qualcosa di simile:

my @letters = ('b', 'c', 'a', 'e', 'd'); 
print join(",", sort(@letters)) . "\n"; 

uscita:

a,b,c,d,e 

Per il primo scenario, si aggiungono \n all'elenco di lettere e quindi lo ordinano. Quindi finisce all'inizio. Ecco un esempio

my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort @letters , "\n", 1, 2, 3; 

Uscite:

# it outputs a newline and then the characters: 

123abcde 

In generale, è utile usare le parentesi per chiarire su quali comportamenti si vuole ottenere.

my @letters = ('b', 'c', 'a', 'e', 'd'); 
print sort(@letters), "\ntest"; 

Uscite:

abcde 
test