Citat:
niksa:
Ali, da li postoji neki nacin da izvrsim isto ovo sortiranje, ali na osnovu npr. podataka "nesto1" ili "nesto2"??? Ovo me interesuje i bas muci!!!
Nadam se da ce mi neko pomoci!!
HVALA UNAPRIJED!
Najefikasnije sortiranje za takve potrebe je tzv. schwartzian transform
ako te zanima kako funkcionira, imas sve na,
http://www.pobox.com/~japhy/docs/sorting.html
#!/usr/bin/perl
use strict;
use warnings;
my $str = q{nesto|nesto1|nesto2|nesto3|....
nesto|nesto1|nesto2|nesto3|....
nesto|nesto1|nesto9|nesto3|....
nesto|nesto1|nesto7|nesto3|....
nesto|nesto1|nesto5|nesto3|....
};
my @sorted = SSort(source => \$str, byfield => 2, spliton => '\|');
print join "\n", @sorted;
print "\n\n";
@sorted = SSort(
source => \$str,
byfield => 2,
spliton => '\|',
ssub => sub { $b->[1] cmp $a->[1] }
);
print join "\n", @sorted;
print "\n\n";
sub SSort {
######################################
#
# schwartz. sort
#
######################################
my %arg = @_;
my($source, $byfield, $spliton, $ssub) = @arg{qw/source byfield spliton ssub/};
#default cmp sort
if (!$ssub) { $ssub = sub { $a->[1] cmp $b->[1] } }
elsif ($ssub eq 'num') { $ssub = sub{ $a->[1] <=> $b->[1]} }
#default || separator
$spliton = $spliton ? qr/$spliton/ : qr/\Q||/;
#scalar ref?
if (ref $source eq 'SCALAR') { $source = [split /\n+/, $$source] }
return
map $_->[0],
sort $ssub
map [ $_, (split /$spliton/)[$byfield] ], @$source;
}