An alternative to doing the whole thing with a regex would be to split into individual path elements then push joined elements onto the array, popping elements off the end until there's nothing left.
use 5.026;
use warnings;
use Data::Dumper;
my @paths = qw{
/abc/def/ghi
/wxy/z
/usr/local/lib/x86_64-linux-gnu/perl/5.26.1
bin/fred
somefile
};
foreach my $path ( @paths )
{
my @elems = split m{/}, $path;
my @arr;
while ( @elems )
{
last if @elems == 1 && ! $elems[ 0 ]; # Ignore empty first ele
+ment
# if path starts with a
+/
push @arr, join q{/}, @elems;
pop @elems;
}
say $path;
print Data::Dumper->Dumpxs( [ \ @arr ], [ qw{ *arr } ] );
say q{-} x 30;
}
The output.
/abc/def/ghi
@arr = (
'/abc/def/ghi',
'/abc/def',
'/abc'
);
------------------------------
/wxy/z
@arr = (
'/wxy/z',
'/wxy'
);
------------------------------
/usr/local/lib/x86_64-linux-gnu/perl/5.26.1
@arr = (
'/usr/local/lib/x86_64-linux-gnu/perl/5.26.1',
'/usr/local/lib/x86_64-linux-gnu/perl',
'/usr/local/lib/x86_64-linux-gnu',
'/usr/local/lib',
'/usr/local',
'/usr'
);
------------------------------
bin/fred
@arr = (
'bin/fred',
'bin'
);
------------------------------
somefile
@arr = (
'somefile'
);
------------------------------
A little more long-winded but possibly simpler to understand. I hope this is helpful.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.