Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: nettezzaumana 26 Května 2009, 18:21:09

Název: perl sort [vyřešeno]
Přispěvatel: nettezzaumana 26 Května 2009, 18:21:09
caues ..

jak se prosim `@foo = ("c", "a", "b/b/a", "b/c");` sesortuje ale s ohledem jako by to byly cesty .. nemuzu na to prijit ..

vysledek by mel bejt `@foo = "a", "c", "b/c", "b/b/a";` .. v `perldoc -f sort` to nejak nevidim, resp. nedokazu pochopit z prikladu ..

diky
Název: Re: perl sort
Přispěvatel: nettezzaumana 27 Května 2009, 10:36:32
abych vam usetril praci, tak nize je malej skriptik co to vypisuje nesortovane,, staci jen sesortovat v ramci `return @flist`

Citace
#!/usr/bin/env perl

use warnings;
use strict;
use File::Find;

sub build_flist {
        my($fpath);
        our(@flist);
        $fpath = shift;
#       chdir("$fpath");
        @flist = "";
        find(\&wanted, "$fpath");
        sub wanted {
                my($found);
                $found = $File::Find::name;
                push(@flist, "$found");
        };

#        return sort {
#                $a =~ tr[/][] <=> $b =~ tr[/][] || $a cmp $b;
#                } @flist;
         return @flist;
};

my $action = $ARGV[0];

print "$_\n" foreach(build_flist("$action"));

exit;

order musi bejt nasledujici ::

$rootdir/$singlefiles .. ->
$rootdir/$dir1/$singlefiles .. ->
$rootdir/$dir1/$dir1/$singlefiles .. ->
$rootdir/$dir1/$dir2/$singlefiles .. ->
..
$rootdir/$dir2/$singlefiles .. ->
..
Název: Re: perl sort
Přispěvatel: Martin Kiklhorn 28 Května 2009, 03:59:45
Z perldoc to nepochopím taky. Protože se rád pereš s věcmi tak říkám vyřeš si sám, ale přidám nějaké odkazy:
http://perl.eurohost.cz/associative.htm
http://www.usenix.org/publications/perl/perl01.html
Název: Re: perl sort
Přispěvatel: nettezzaumana 28 Května 2009, 09:13:23
to finalni sortovani je desne pomaly .. :/

Citace: psort.pl
#!/usr/bin/env perl
## prints a correct directory tree for given path
## usage: foo path d|f|a

use warnings;
use strict;
use File::Find;

our(@files, @dirs);
my($input, @final, $foo, $bar);

find(\&bingo, shift(@ARGV));

sub bingo {
        $_ = $File::Find::name;
        push(@files, $_) if -f;
        push(@dirs, $_) if -d;
};

## now we'v got a separated list of files and dirs
@files = sort(@files);
@dirs = sort(@dirs);

#### playground:
while($input = shift(@ARGV)) {
        if($input eq 'd') {
                print "$_\n" foreach(@dirs);
                next;
        };
        if($input eq 'f') {
                print "$_\n" foreach(@files);
                next;
        };
        if($input eq 'a') {

                ## sorting is *very *very slow ..
                foreach(@dirs) {
                        $foo = $_;
                        push(@final, $foo);
                        foreach(@files) {
                                $bar = $_;
                                $bar =~ s@/.[^/]*$@@;
                                push(@final, $_) if($foo eq $bar);
                        };
                };
                print "$_\n" foreach(@final);
        };
};

exit;


Název: Re: perl sort
Přispěvatel: Martin Kiklhorn 28 Května 2009, 13:29:22
Kód: [Vybrat]
#!/usr/bin/perl
#!/usr/bin/perl

use warnings;
use strict;
use File::Find;

sub print_tree {
        my $dir    = shift;
        my $pathname = [$_];
        find ({ wanted => sub {
                return if /^\.\.?$/;
                printf "%s\n", join ('/', @$pathname, $_);                                   
                if (-d and not -l) {
                        push (@$pathname, $_);
                }
        },
        preprocess  => sub {
                sort {       
                        # Files sort before dirs       
                        (-f $a ? (-f $b ? $a cmp $b : -1 ) : (-f $b ? 1 : $a cmp $b))       
                } @_       
        },       
        postprocess => sub {       
                        pop (@$pathname);
                },
        }, $dir);
}

foreach (@ARGV) {
        print_tree ($_);
}



Název: Re: perl sort
Přispěvatel: Martin Kiklhorn 29 Května 2009, 06:43:49
Omlouvám se za mystifikaci, to co jsem odkazoval původně (http://forum.ubuntu.cz/index.php/topic,36047.msg266763.html#msg266763) je sice krásný příklad na sort podle dvou kritérií, ale...
Původně jsem zbrkle myslel mít pole s názvy souborů které by byly klíčem k folderům, jenže samotné názvy souborů by jako klíč nestačily, musela by někde být i "úroveň" zanoření. A úroveň zanoření ideálně číslovaná s nějakým oddělovačem, s neznámou hloubkou zanoření, takže pole.
Něco na způsob
Citace
"$rootdir/$singlefiles",0,0
"$rootdir/$dir1/$singlefiles",0,0,0
"$rootdir/$dir1/$dir1/$singlefiles",0,0,0,0
"$rootdir/$dir1/$dir2/$singlefiles",0,0,1,0
"$rootdir/$dir2/asinglefiles",0,1,0
"$rootdir/$dir2/bsinglefiles",0,1,1
"$rootdir/$dir2/csinglefiles",0,1,2
...
"$rootdir/$dir2/zzzsinglefiles",0,1,750
Kde při postupném procházení upravuješ jen index v příslušné úrovni zanoření a vysledkem je setřídění.
Tam jsem opět narazil na nutnost třídit soubory na stejné úrovni přednostně před folderama na téže úrovni a pak jsem si vzpomněl že jsem kdysi dávno něco s tříděním "soubory dříve než foldery" řešil, našel jsem to a pastnul sem.
A dnes jsem konečně vygooglil sice ne původní zdroj, ale téměř určitě původní skript (http://stackoverflow.com/questions/767879/script-to-navigate-a-directory-tree-and-print-the-file-names/768324#768324)

Název: Re: perl sort
Přispěvatel: nettezzaumana 29 Května 2009, 09:11:55
http://www.abclinuxu.cz/poradna/programovani/show/266500

^^ dekuji. vyreseno.