in reply to Re: remove a blank line after a string
in thread remove a blank line after a string

Thanks for the reply. The blank line is actually in the middle of the message following the content type 7bit line. What might work is to get rid of all blank lines
  • Comment on Re^2: remove a blank line after a string

Replies are listed 'Best First'.
Re^3: remove a blank line after a string
by davido (Cardinal) on Jan 26, 2005 at 18:25 UTC

    Ok, I misunderstood. This should do the trick:

    for ( 0 .. $#{$msg} ) { next unless $msg->[$_] =~ m/\QContent-Transfer-Encoding: 7bit\E/i; splice( @{$msg}, $_ + 1, 1 ) if $msg->[ $_ + 1 ] =~ m/^\s+$/; last; }

    This scans through the message until it finds the "Content-Transfer-Encoding: 7bit" string. The next line is then checked to see if it is blank except for whitespace, and if it is, it's deleted. And since we're done looking for the blank line, the loop is exited.


    Dave

      A range operator would give you an arguably elegant rewrite:
      @$msg = grep {(m/\QContent-Transfer-Encoding: 7bit\E/i .. /^\s*$/) ne +'2E0'} @$msg;
      or, to use the splice and short-circuiting:
      my $i = 0; for (@$msg) { if ((/\QContent-Transfer-Encoding: 7bit\E/ .. /^\s*$/) eq '2E0') { splice(@$msg, $i, 1); last; } ++$i; }

      Caution: Contents may have been coded under pressure.
      You are my holy father!!!!!!!!!!!!!!!!

      How would i write the lines prior to the deleted blank line to a file?

      my $msg = $pop->get($msgnum); for ( 0 .. $#{$msg} ) { next unless $msg->[$_] =~ m/\QContent-Transfer-Encoding: 7bit\E/i; splice( @{$msg}, $_ + 1, 1 ) if $msg->[ $_ + 1 ] =~ m/^\s+$/; delete last; }

      Code tags and formatting added by davido. Please read Writeup Formatting Tips.

        Maybe like this? (I'm sure you could come up with something yourself if you thought about it)

        my $msg = $pop->get($msgnum); LOOP: for ( 0 .. $#{$msg} ) { unless( $msg->[$_] =~ m/\QContent-Transfer-Encoding: 7bit\E/i ) { print OUTFILE $msg->[$_]; next LOOP; } splice( @{$msg}, $_ + 1, 1 ) if $msg->[ $_ + 1 ] =~ m/^\s+$/; # delete # This is probably a mistake. Delete what? And where's +the semicolon? last LOOP; }

        Dave

      Seems a bit complex for filtering an array, yeah? Will something this work? (Can't test it myself right now.)

      my @msg = grep /\S/, @{$pop->get($msgnum)}; # then the @{$msg} stuff has to change, of course

        That would remove all blank lines, which may be ok with the OP, but doesn't sound all that desirable to me. I would think that one would want to keep the message content intact.

        Perhaps it's complex, but my solution does only remove one blank line, and that line can only follow the "Content-type" line. I'll admit the range operator would have been more elegant though.


        Dave