in reply to Re: Append Next Line To Current Line
in thread Append Next Line To Current Line

I should have posted more code. Here is my complete code:

open(FH, "error_log:); @data = <FH> foreach $line (@data) { if ( ($line =~ /notice/)) { $line =~ s/ /,/g; my @L1 = split(/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy, +|rd,|wr,|ka,|log,|dns,|cls,|bsy:,|in,|/, $line); $line =~ s/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy,|rd,| +wr,|ka,|log,|dns,|cls,|bsy:,|in,//g; print $line;

Note that I printed only to see the output. Output is the following:

Wed,Jun,13,10:40:35,2012,758,42,0,29,11,0,0,2 Wed,Jun,13,10:40:35,2012,29,mod_was_ap22_http.c Wed,Jun,13,10:41:35,2012,761,39,0,34,5,0,0,0 Wed,Jun,13,10:41:35,2012,34,mod_was_ap22_http.c Wed,Jun,13,10:42:35,2012,769,31,0,22,6,0,0,3 Wed,Jun,13,10:42:35,2012,22,mod_was_ap22_http.c Wed,Jun,13,10:43:35,2012,754,46,0,29,17,0,0,0

I would like the number (42) placed in csv form after the others on the first line corresponding to the timestamp. If the line has nothing below (ex. last line) I would like to input a zero. Thank you for your help.

Replies are listed 'Best First'.
Re^3: Append Next Line To Current Line
by Ransom (Beadle) on Jul 02, 2012 at 18:24 UTC

    First we're going to need access to previous/next lines. Instead of a foreach loop, try out a for loop so we can use index numbers on the @data array. The following snippet should get you started. Basically you now have two lines of data per each loop which will allow you to compare and append data from both.

    open(FH, "error_log"); @data = <FH> for (my $index = 0; $index < $data; $index++) { my $line = @data[$index]; my $nextline = @data[$index + 1] if ($index < $data - 1); if ( ($line =~ /notice/)) { #format line $line =~ s/ /,/g; my @L1 = split(/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy, +|rd,|wr,|ka,|log,|dns,|cls,|bsy:,|in,|/, $line); $line =~ s/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy,|rd,| +wr,|ka,|log,|dns,|cls,|bsy:,|in,//g; print $line; #format nextline $nextline =~ s/ /,/g; my @L1 = split(/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy, +|rd,|wr,|ka,|log,|dns,|cls,|bsy:,|in,|/, $nextline); $nextline =~ s/|notice|\[|\]|,mpmstats:,|\t|rdy,|bsy,| +rd,|wr,|ka,|log,|dns,|cls,|bsy:,|in,//g; print $nextline; }

    You'll need to take care of the ending situation (when $index is the last element of @data). I'm not entirely positive what your regex is doing, but I'm assuming that's where data is getting put into a csv format? You'll need to get at the innards of the line in order to append data from it. Hope this helps some, keep posting if you need to.

      Instead of a foreach loop, try out a for loop so we can use index numbers on the @data array

      You might not be aware that for and foreach are synonyms for each other and can be used interchangeably. You can also use a Perl-style for loop to access indexes into an array.

      knoppix@Microknoppix:~$ perl -Mstrict -Mwarnings -E ' > foreach ( my $count = 0; $count < 5; $count ++ ) > { > say $count; > } > > my @arr = qw{ one two three }; > for my $elem ( @arr ) > { > say $elem; > } > > foreach my $idx ( 0 .. $#arr ) > { > say $arr[ $idx ]; > }' 0 1 2 3 4 one two three one two three knoppix@Microknoppix:~$

      I hope this is helpful.

      Update: Reworded first sentence slightly as it might have come over as a bit rude, which was not my intention.

      Cheers,

      JohnGG

        Yikes, you're blowing my cover as a perl programmer ;-)

        Seriously though, I did not know they were interchangable. It's one of those "I've always done it this way" moments. It's neat to know that foreach is just a shortcut rather than something different. Thank you

Re^3: Append Next Line To Current Line
by Anonymous Monk on Jul 02, 2012 at 18:00 UTC

    My mistake: The number is not 42 it would be 29 for the first line.