Only 4 lines less?
use strict; use warnings; my $INDENT=' 'x2; my @aSorted=sort qw(/var/www/data/stuff /var/www /var/www/data/misc /var/logs /var/logs/data); my $aLast=[]; foreach my $sPath (@aSorted) { chomp $sPath; my @aName = split(m{/}, $sPath); for my $i (0..$#aName) { if (($#$aLast<$i) || ($aLast->[$i] ne $aName[$i])) { if ($i>1) { print '', $INDENT x ($i-1), '->'; } print $aName[$i], "\n"; } } $aLast=\@aName; }

outputs

var ->logs ->data ->www ->data ->misc ->stuff

By using the leading portions of the path as a hash key, the subscript separator variable, $; (see perlvar), you can preserve the exact ordering given by the OP. This also takes under 20 lines, excluding the strict and warnings declaration.

use strict; use warnings; my $INDENT=' 'x2; my @aUnsorted= qw(/var/www/data/stuff /var/www /var/www/data/misc /var/logs /var/logs/data); my %hVisited; foreach my $sPath (@aUnsorted) { chomp $sPath; my @aName = split(m{/}, $sPath); for my $i (0..$#aName) { my $k=join('/',@aName[0..$i]); unless ($hVisited{$k}) { if ($i>1) { print '', $INDENT x ($i-1), '->'; }; print $aName[$i], "\n"; $hVisited{$k}=1; } } }

outputs

var ->www ->data ->stuff ->misc ->logs ->data

For the OP, I don't know that language is the real winner here in getting the volume of code down. Understanding the nature of the problem itself is far more important. PHP also has a split function and str-repeat takes the place of Perl's x operator, so this code could be translated virtually as is to PHP.

Best, beth

Update: ikegami is right, I'm not actually using $; but rather the path subsegments as the hash key. See strike out above for correction.


In reply to Re^2: directory listing to array tree by ELISHEVA
in thread directory listing to array tree by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.