LINUX.ORG.RU

История изменений

Исправление vtVitus, (текущая версия) :

#!/usr/bin/perl
use strict;
use warnings;

my $start_level = 1;
my $src = $ARGV[0];

print "$ARGV[0]\n";
my @arr = sort_ ($ARGV[0], $start_level);

sub sort_ {
    my ($src, $level) = @_; 
    opendir (my $dh, $src) || return;
    my @sort_dir = grep {!/^\.{1,2}$/} map $_->[0], sort {$a->[1] <=> $b->[1] || $a->[0]cmp $b->[0] } map [ $_, -f "$src/$_"], readdir ($dh); #здесь убираются файлы . и .. и происходит сортировка
    closedir ($dh);
    for (my $i=0; $i < @sort_dir; $i++) {
	my $elem = $sort_dir[$i];
	my $last = $i eq (@sort_dir -1);
	my $head = $level eq $start_level;
	if ( -d "$src/$elem" or $head) {
		my $headSymbol = ($last and $head) ? "└" : "├";
		my $space = "──";
		printf "%s%s %s\n", $headSymbol, $space x $level, $elem;
	} else {
		my $headSymbol = "│";
		my $space = "  ";
		my $space2 = $last ? "└" : "├";
		printf "%s%s %s── %s\n", $headSymbol, $space x ($level-1), $space2, $elem;
	}
	sort_ ("$src/$elem", $level+1) if ( -d "$src/$elem" );
    }
}

Исправление vtVitus, :

#!/usr/bin/perl
use strict;
use warnings;

my $start_level = 1;
my $src = $ARGV[0];

print "$ARGV[0]\n";
my @arr = sort_ ($ARGV[0], $start_level);

sub sort_ {
    my ($src, $level) = @_; 
    opendir (my $dh, $src);
    my @sort_dir = grep {!/^\.{1,2}$/} map $_->[0], sort {$a->[1] <=> $b->[1] || $a->[0]cmp $b->[0] } map [ $_, -f "$src/$_"], readdir ($dh); #здесь убираются файлы . и .. и происходит сортировка
    closedir ($dh);
    for (my $i=0; $i < @sort_dir; $i++) {
	my $elem = $sort_dir[$i];
	my $last = $i eq (@sort_dir -1);
	my $head = $level eq $start_level;
	if ( -d "$src/$elem" or $head) {
		my $headSymbol = ($last and $head) ? "└" : "├";
		my $space = "──";
		printf "%s%s %s\n", $headSymbol, $space x $level, $elem;
	} else {
		my $headSymbol = "│";
		my $space = "  ";
		my $space2 = $last ? "└" : "├";
		printf "%s%s %s── %s\n", $headSymbol, $space x ($level-1), $space2, $elem;
	}
	sort_ ("$src/$elem", $level+1) if ( -d "$src/$elem" );
    }
}

Исходная версия vtVitus, :

#!/usr/bin/perl
use strict;
use warnings;

my $start_level = 1;
my $src = $ARGV[0];

print "$ARGV[0]\n";
my @arr = sort_ ($ARGV[0], $start_level);

sub sort_ {
    my ($src, $level) = @_; 
    opendir (my $dh, $src);
    my @sort_dir = grep {!/^\.{1,2}$/} map $_->[0], sort {$a->[1] <=> $b->[1] || $a->[0]cmp $b->[0] } map [ $_, -f "$src/$_"], readdir ($dh); #здесь убираются файлы . и .. и происходит сортировка
    closedir ($dh);
    for (my $i=0; $i < @sort_dir; $i++) {
	my $elem=$sort_dir[$i];
	my $last = $i eq (@sort_dir -1);
	my $head = $level eq $start_level;
	if ( -d "$src/$elem" or $head) {
		my $headSymbol = ($last and $head) ? "└" : "├";
		my $space = "──";
		printf "%s%s %s\n", $headSymbol, $space x $level, $elem;
	} else {
		my $headSymbol = ($last and $head) ? "└" : "│";
		my $space = "  ";
		my $space2 = $last ? "└" : "├";
		printf "%s%s %s── %s\n", $headSymbol, $space x ($level-1), $space2, $elem;
	}
	sort_ ("$src/$elem", $level+1) if ( -d "$src/$elem" );
    }
}