Newsgroup: it.comp.lang.perl
Titolo: sort

Ho un dubbio. Un array di 'argomenti' descritti dalla seguente regex:
/\d+-\d+/ (ovvero "una cifra qualsiasi ripetuta più volte, seguita da -,
seguita da una cifra qualsiasi ripetuta più volte"), deve essere ordinato
in modo decrescente, sulla base della cifra che precede '-'. sort
considera i valori da ordiare come numeri? Come considera la presenza del
'-'? 
ciao
stefano
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 '-'?
   sort fa quello che tu gli imponi di fare:
<code>
	my @array=(
	    '12-65',
	    '98-76',
	    '7676-8776',
	    '1-2'
	);
	my @newarray=reverse sort {
	    $a=~/(\d+)-\d+/;
	    my $my_a=$1;
	    $b=~/(\d+)-\d+/;
	    my $my_b=$1;
	    $my_a <=> $my_b
	} @array;
	print "@array\n";
	print "@newarray\n"
</code>
	$ perldoc -f sort
	$ perldoc -f reverse
-- 
Alla prossima,
Marco

 	} @array;
ottimo ed abbondante! non avevo pensato di fare un'assegnazione ad $a e $b!
Ma, usando strict, devo dichiarare anche my_a/my_b ? visto che:
If you're using strict, you must not declare $a and $b as lexicals. They
are package globals. 


	$ perldoc -f reverse
Piu` piccolo e piu` veloce con una Schwartzian Transform [1]:
-------
my @array = qw/12-65 98-76 7676-8776 1-2/;
my @newarray = 
	reverse 
	map  { $_->[0] } 
	sort { $a->[1] <=> $b->[1] }
	map  { [ $_, /(\d+)-\d+/] } 
	@array;
print "@array\n";
print "@newarray\n";
-------
ciao
Stefano
[1] 
http://www.stonehenge.com/merlyn/UnixReview/col06.html

beh... allora così è ancora più piccola e più veloce :-)
    my @array = qw/12-65 98-76 7676-8776 1-2/;
    my @newarray =
    reverse
    map  { join '-', @$_ }
    sort { $a->[1] <=> $b->[1] }
    map  { [ split '-' ] }
    @array;
    print "@array\n";
    print "@newarray\n";
ciao
--
________________________________________________________________________
'It said: "Insert disk #3", but only two will fit!'

anzi... a dire il vero, secondo quanto richiesto da 'stefano',
"deve essere ordinato in modo decrescente, sulla base della cifra che
precede '-' ",
il sort dev'essere riscritto cosě:
    # cambiata la prima cifra '120-65'
    # (altrimenti funziona sia con [0] che con [1])
    my @array = qw/120-65 98-76 7676-8776 1-2/;
    my @newarray =
    reverse
    map  { join '-', @$_ }
    sort { $a->[0] <=> $b->[0] } #<- cifra che precede '-'
    map  { [ split '-' ] }
    @array;
    print "@array\n";
    print "@newarray\n";
ciao
--
________________________________________________________________________
"We are born naked, wet, and hungry. Then things get worse."

Domiziano, grazie. Da una rapida prova sui miei dati, quest'ultimo
suggerimento funziona (ma anche quellodel mio omonimo!). Siccome sono agli
agli inizi con perl, se non ti spiace, potresti descrivere cosa fanno in
particolare le fx map che precedono e seguono il sort? il codice di
'stefano' l'ho capito, il tuo purtroppo..no!
Grazie
stefano

> il codice di 'stefano' l'ho capito, il tuo purtroppo..no!
come godo quando mi dicono così :-))))
    map  { [ split '-' ] }
prende ogni elemento di @array (che momentaneamente sta in $_) e lo splitta
in due elementi usando '-' come separatore. Esplicitamente sarebbe "split
'-', $_" ma il $_ lo puoi omettere (vedi perldoc -f split).
In pratica se $_ era '123-456', ritorna (123, 456)
messo in parentesi quadre ritorna la reference all'array di 2 elementi come
dire [123, 456] quindi avrai ($_->[0] == 123) e ($_->[0] == 456)
    map  { join '-', @$_ }
in $_ (elemento della lista trattata da map) c'è la reference all'array di 2
elementi [123, 456].
Il join unisce gli elementi dell'array @$_ (dereference) in una stringa
intercalando gli elementi con '-'. In pratica ricompone i quello che split
aveva diviso.
ciao
--
________________________________________________________________________
"If you want your spouse to listen and pay strict attention to every word
you say, talk in your sleep."

ops... volevo dire: $_->[1] == 456
--
________________________________________________________________________
"To do great things is difficult, but to command great things is more
difficult. - Friedrich Wilhelm Nietzsche"