Problem splitting lines in a file

M

Mothra

I'm trying to parse a log file using ';' as a newline and then wherever
I find items inside '(..)', indenting those lines thus:


foo;bar(foo;bar(foobar);foo)foobar

becomes

foo
bar(
foo
bar(
foobar
)
foo
)
foobar

What I've got so far is below - the problem is that when there are
nested sets of parentheses, I can't increase the indents accordingly.
Also, I can't work out how to get the closing ')' on a line by itself.

I'm in a bit of a pickle - can anyone help?

What I've got so far follows:


#!/usr/bin/perl -w
use strict;
$|=0;

my @in = <>;
my $tbchr = "\t";
my $tbcnt = 0;

for(@in){
my @ln=split(';', $_);
my $i;
for ($i=0; $i<@ln; $i++){
chomp($ln[$i]);
my @subln;
if ( $ln[$i] =~ /\([^)]/ ) {
@subln = split('\(',$ln[$i]);
my $k;for($k=0;$k<@subln;$k++){ $subln[$k] .=
'(' }
} elsif ( $ln[$i] =~ /[^(]\)/ ) {
@subln = split('\)',$ln[$i]);
my $k;for($k=0;$k<@subln;$k++){ $subln[$k] .=
')' }
} else {
@subln = $ln[$i];
}


for(@subln){
my $j;
for($j=0; $j<$tbcnt; $j++){ print $tbchr }
print "$_\n";
$tbcnt++ if /\(/;
$tbcnt-- if /\)/;
}

}
}
 
V

vkeyboard

I'd probably use a counter in a hash to keep track of the ()'s. One key
for the ) and one key for the (. To get the ) on a line by itself I'd do a
=~ s/)/\n)/

Can't remember if you'll need to escape that ) or not.
I'm trying to parse a log file using ';' as a newline and then wherever
I find items inside '(..)', indenting those lines thus:




What I've got so far is below - the problem is that when there are
nested sets of parentheses, I can't increase the indents accordingly.
Also, I can't work out how to get the closing ')' on a line by itself.
I'm in a bit of a pickle - can anyone help?
What I've got so far follows:

#!/usr/bin/perl -w
use strict;
$|=0;
my @in = <>;
my $tbchr = "t";
my $tbcnt = 0;
for(@in){
my @ln=split(';', $_);
my $i;
for ($i=0; $i<@ln; $i++){
chomp($ln[$i]);
my @subln;
if ( $ln[$i] =~ /([^)]/ ) {
@subln = split('(',$ln[$i]);
my $k;for($k=0;$k<@subln;$k++){ $subln[$k] .=
'(' }
} elsif ( $ln[$i] =~ /[^(])/ ) {
@subln = split(')',$ln[$i]);
my $k;for($k=0;$k<@subln;$k++){ $subln[$k] .=
')' }
} else {
@subln = $ln[$i];
}

for(@subln){
my $j;
for($j=0; $j<$tbcnt; $j++){ print $tbchr }
print "$_n";
$tbcnt++ if /(/;
$tbcnt-- if /)/;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top