As a side note @RosettaStone: Many languages just showed their
Data::Dumper equivalent! :-|
my emphasize is on readability and flexibility for alternative formats, but YMMV! =)
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dump qw/pp/;
#use diagnostics;
use Test::More tests => 1;
my $input = <<'__IN__';
A
|
|--B
| |
| |--C
| |
| |---PQR
| |---XYZ
|--D
| |
| |---LMN
|---XYZ
__IN__
my $expected = <<'__EXP__';
Column1 Column2 Column3 Column4
A B C PQR
A B C XYZ
A D LMN
A XYZ
__EXP__
my (@path,@table);
my $max=0;
for (split /\n/, $input) {
#print ;
/^ (.*?) (---(\w\w\w))? $ /x;
my $leave = $3;
my @track = split / |--/, $1;
die "parsing error $_"
unless @track;
$path[$#track] = $1
if ($track[-1] =~ /(\w)/ );
#pp [@track], [@path], $leave;
if ($leave) {
push @table, [ @path[0..$#track], $leave ];
$max = @track if @track >$max;
}
}
pp \@table;
my $out="";
$out .= "Column$_\t" for 1..$max+1;
$out .= "\n";
for (@table){
my $width = @$_-1;
$out .= join "\t", @$_[0..$width-1];
$out .= "\t"x($max-$width+1);
$out .= @$_[$width];
$out .= "\n";
}
print $out;
is($out,$expected);
1..1
[
["A", "B", "C", "PQR"],
["A", "B", "C", "XYZ"],
["A", "D", "LMN"],
["A", "XYZ"],
]
Column1 Column2 Column3 Column4
A B C PQR
A B C XYZ
A D LMN
A XYZ
Cheers Rolf
( addicted to the Perl Programming Language)
-
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.