in reply to Re: Finding deepest directories in a tree structure represented in a flatfile?
in thread Finding deepest directories in a tree structure represented in a flatfile?

The OP requested not to include helloworld/ since there were subdirectories. This addition to your script works but will not be efficient for a large file with the nested searches.

use strict; use warnings; use File::Basename qw( fileparse ); my %seen; while (<DATA>) { (undef, my $path) = fileparse( $_ ); print "$path\n" unless $seen{$path}++; } print "="x70,"\n"; foreach my $key (keys %seen){ print "$key\n" if 1 == scalar grep { /\Q$key/ } keys %seen; } __DATA__ testing123/ foobar/ helloworld/ helloworld/r1/ helloworld/r1/helloworld-5-0.noarch.rpm helloworld/r1/testfile23.txt helloworld/r1/tomcat-7.0.27.rpm helloworld/r2/ helloworld/r2/helloworld-2-0.noarch.rpm helloworld/r2/testfile12.txt helloworld/r2/tomcat-5.0.52.rpm hellotest/

For large files sorting and a pass to remove the current element if the next element matches is needed. Or, assuming that the original file is sorted just check each element against the next one.

use strict; use warnings; use File::Basename qw( fileparse ); my %seen; my @directories; while (<DATA>) { (undef, my $path) = fileparse( $_ ); #push @directories, $path; ## update, I indended to put the push inside the unless block. ## The original works but not exactly as I expected since it puts ## duplicates in the array. #print "$path\n" unless $seen{$path}++; unless ($seen{$path}++) { print "$path\n"; push @directories, $path; } } print "="x70,"\n"; foreach my $index (0..$#directories-1){ my $current = $directories[$index]; print "$current\n" if not $directories[$index+1] =~ /\Q$current/ ; } ### assuming the last one is always terminal print $directories[$#directories], "\n"; __DATA__ testing123/ foobar/ helloworld/ helloworld/r1/ helloworld/r1/helloworld-5-0.noarch.rpm helloworld/r1/testfile23.txt helloworld/r1/tomcat-7.0.27.rpm helloworld/r2/ helloworld/r2/helloworld-2-0.noarch.rpm helloworld/r2/testfile12.txt helloworld/r2/tomcat-5.0.52.rpm hellotest/

Update: This seems to work on a single pass through the file.

use strict; use warnings; use File::Basename qw( fileparse ); my $first=''; my $second=''; while (<DATA>) { $first = $second; (undef, $second) = fileparse( $_ ); print "$second\n" if eof DATA; next unless $first; unless ( $second =~ /\Q$first/) { print "$first\n"; } } __DATA__ testing123/ foobar/ helloworld/ helloworld/r1/ helloworld/r1/helloworld-5-0.noarch.rpm helloworld/r1/testfile23.txt helloworld/r1/tomcat-7.0.27.rpm helloworld/r2/ helloworld/r2/helloworld-2-0.noarch.rpm helloworld/r2/testfile12.txt helloworld/r2/tomcat-5.0.52.rpm hellotest/test.txt hellotest/

Replies are listed 'Best First'.
Re^3: Finding deepest directories in a tree structure represented in a flatfile?
by Anonymous Monk on Dec 07, 2015 at 21:50 UTC
    Thanks for all the examples -- this one works well for me. I don't think the result set will every be large enough to introduce efficiency issues.