Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: perl sort [vyřešeno]  (Přečteno 1753 krát)

nettezzaumana

  • Host
perl sort [vyřešeno]
« kdy: 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
« Poslední změna: 29 Května 2009, 11:10:05 od kiklhorn »

nettezzaumana

  • Host
Re: perl sort
« Odpověď #1 kdy: 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 .. ->
..

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: perl sort
« Odpověď #2 kdy: 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
« Poslední změna: 28 Května 2009, 04:02:03 od kiklhorn »
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

nettezzaumana

  • Host
Re: perl sort
« Odpověď #3 kdy: 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;



Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: perl sort
« Odpověď #4 kdy: 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 ($_);
}



« Poslední změna: 28 Května 2009, 13:41:22 od kiklhorn »
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: perl sort
« Odpověď #5 kdy: 29 Května 2009, 06:43:49 »
Omlouvám se za mystifikaci, to co jsem odkazoval původně 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

« Poslední změna: 29 Května 2009, 06:57:28 od kiklhorn »
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

nettezzaumana

  • Host
Re: perl sort
« Odpověď #6 kdy: 29 Května 2009, 09:11:55 »

 

Provoz zaštiťuje spolek OpenAlt.