Lista folderów bez używania rekurencji.

0

Witam,
Ostatnio(właściwie, to dzisiaj) utkwiłem podczas tworzenia listy katalogów bez używania rekurencji(spowodowane jest to pisaniem owego skryptu w perlu, a z doświadczeń z nim takowa rekurencja mogłaby nie wyjść, ale mniejsza z tym, rekurencja odpada). Wąznym elementem jest również aby lista plików była w osobnej liscie zapisana.

Część skryptu(perl, kolorowanie php powinno ułatwić czytanie ;)):

my @fulllist = ($cpath);
my @filelist;
my $count = 0;

while($count <= $#fulllist){
	my $result =`ls $cpath`;
	@dtemp = split(/\n/, $result);
	for $key(@dtemp){
		my $tmp=`ls $cpath/$key`;
		if("$cpath/$key" eq $tmp){
			@filelist[$#filelist+1+$[] = $key;
		}else{
			@fulllist[$#fulllist+1+$[] = $cpath . '/' . $key;
		}
	}
	$cpath = $fulllist[$count];
	$count ++;
}

dopisane
Boli mnie głowa, coś nowego napisałem, też ie działa, lecz może naprowadzi na wynik

my @foldlist;
my @filelist;
my $cpath;
my $count;

sub IsFile{ #filepath - sprawdze czy sciazka prowadzi do pliku
my $tmp = $_;
my $res = `ls $tmp`;
if($tmp eq $res){return 1;}
else{ return 0;
dopisane: ekhm, dlaczego post został skrócony ? - kmfk
0
kmfk napisał(a)

(spowodowane jest to pisaniem owego skryptu w perlu, a z doświadczeń z nim takowa rekurencja mogłaby nie wyjść,

khm, dlaczegóż to rekurencja w perlu Ci nie działa? Mi działa wyśmienicie...

Pełnej iteracji na dowolną głębokość w strukturze katalogów bez rekurencji nie osiągniesz. A powiedz mi, czy chcesz osiągnąć coś czego nie daje Ci taki gotowy moduł jak File::DirWalk ?

I kilka uwag:

while($count <= $#fulllist){
	my $result =`ls $cpath`; #czemu nie glob() ? odpalanie zewnętrznego procesu nie jest najlepszym rozwiązaniem, skoro nie jest potrzebne...
	@dtemp = split(/\n/, $result);
	for $key(@dtemp){
		my $tmp=`ls $cpath/$key`; # j.w. odnośnie glob()
		if("$cpath/$key" eq $tmp){
			@filelist[$#filelist+1+$[] = $key; #tego do końca nie rozumiem - nie prościej push()?
		}else{
			@fulllist[$#fulllist+1+$[] = $cpath . '/' . $key; #j.w. odnośnie push()
		}
	}
	$cpath = $fulllist[$count];
	$count ++; #notacja prefiksowa jest szybsza
}

[...]

my @foldlist;
my @filelist;
my $cpath;
my $count;

sub IsFile{ #filepath - sprawdze czy sciazka prowadzi do pliku
my $tmp = $_;
my $res = `ls $tmp`;
if($tmp eq $res){return 1;}
else{ return 0; # a tutaj dość typowa nadmiarowość - nie prościej return ($tmp eq $res) ?

Generalnie, jeśli wystarczy Ci lista folderów z max dwóch poziomów, to najprostsze rozwiązanie, tak na szybko:

print join ("\n", grep {-d $_;} glob '/etc/*/*');

1 użytkowników online, w tym zalogowanych: 0, gości: 1