Why set the length of the array only to change it immediately? I also hate the needless use of global vars.
my @path = '.';
while (<DATA>) {
chomp;
my ($prefix, $node) = /^((?:\| )*[|`]-- )(.+)/
or next;
$#path = length($prefix)/2 - 1;
$path[-1] = $node;
print $prefix, join("/" => @path), "\n";
}
Alternative, we could use splice.
my @path = '.';
while (<DATA>) {
chomp;
my ($prefix, $node) = /^((?:\| )*[|`]-- )(.+)/
or next;
splice @path, length($prefix)/2-1, 0+@path, $node;
print $prefix, join("/" => @path), "\n";
}
It avoids the addition of magic to @path, and it combines two operations. The latter usually makes something more readable, but it's unfortunately not the case here.
Speaking of readability, that regex is rather hard to read. I had something like that initially, but I switched to split because it was much more straightforward.
my @path = '.';
while (<DATA>) {
chomp;
my ($prefix, $node) = split(/(?<=-- )/, $_, 2)
or next;
$#path = length($prefix)/2 - 1;
$path[-1] = $node;
print $prefix, join("/" => @path), "\n";
}
|