in reply to Re^4: Formatting
in thread Formatting

Important: read the health warning below.

Does a # in the data indicate a comment? If it does the code below skips lines begining with a #. If I have not understood you correctly, please give an example of the data.
The code also adds a comma to each 'inline' style.
I've added a variable to help make the code clearer.

Health warning
There is more than one way to do this! This is how I do it and it is heavily influenced by the fact that my main experience in coding is vb which makes most people around here shudder! For example, in Programing Perl, a long list of elsifs is frowned on. I tell myself that as I'm using the less well known 'baby idiom' (to be polite) it is ok. Until, at least, I learn a better way.
Also my main motive for helping is to hone my own skills (which badly need honing).

while (my $line_in = <DATA>) { chomp($line_in); next if $line_in =~ /^#/; # skip comments my ( $style, $content ) = $line_in =~ /^(\w)\s+(.*)$/; my $block = $tag->{ $style }->{ block }; $line_out = join( '', $tag->{ $style }->{ open }, $content, $tag->{ $style }->{ close } ); if ( $block and ! $block_flag ){ $output = join( '', $output, $tag->{ $style }->{ block_open }, $line_out, ',' ); $block_flag = $style; } elsif ( ! $block and $block_flag ){ chop $output; # remove final comma $output = join( '', $output, $tag->{ $block_flag }->{ block_close }, "\n", $line_out, "\n" ); $block_flag = ''; } elsif ( $block ){ $output = join( '', $output, $line_out, ',' ); } else{ $output = join( '', $output, $line_out, "\n" ); } $line_out = ''; } # data with comments __DATA__ R Whatever # First comment R Another whatever K Perl K Monks # Second comment K Is K Cool T Another style R Whatever

Replies are listed 'Best First'.
Re^6: Formatting
by mrxg4 (Initiate) on Jul 12, 2004 at 21:05 UTC
    John,
    The "#" in my code would be a comment, but it should be translated to a <!-- Whatever comment -->, not completely ignored.

    I really appreciate your help, and if you have AOL/ICQ/MSN or e-mail, please let me know so we can discuss this in a simpler manner.

    Thanks again,
    Marcos
      Add another record:
      '#' => { open => '<!-- ', close => ' -->', block => 0 }
      The key needs quotes ('#'). Make sure you have a comma after the previous record
      Remove:
      next if $line_in =~ /^#/; # skip comments
      wfsp
        John,
        Ok, i'll try that again.

        Anyways, the script is like 95% complete, all i have to implement now (which i have partially done) is an alternate $tag, depending on whether there is a special character in every block.

        I have done this with a subroutine:

        sub piper_end() {

        my $tag = { K => { open => '%',
        close => '',
        block => 1,
        block_open => "<c>\n".'<p>',
        block_close => '</p>'."\n<t>"
        },
        R => { open => '<li>',
        close => '</li>'."\n",
        block => 1,
        block_open => '<r>'."\n",
        block_close => '</then>'."\n".'</ifflag>'."\n".'</r>'."\n</t>\n</c>"
        },
        S => { open => '<set name="temant">',
        close => '</set>',
        block => 0
        },
        F => { open => '<setflag param="',
        close => '"/>',
        block => 0,
        }
        };

        return $tag;
        }

        Now if a $style tag matches this special character (I), it will call upon the subroutine to update a specific block_close (for R). Is this method alright?

        Thanks again,
        Marcos
        John,
        By the way, I know why the '#' wasn't working, because of the regular expression when spliting:
        my ( $style, $content ) = $line_in =~ /^(\w)\s+(.*)$/;

        I've converted it to:
        my ( $style, $content ) = $line_in =~ /^(\w|\#)\s+(.*)$/;

        And now it works properly :)
        Let me know what you think on the previous question, the one on the subroutine.

        Thanks.
        Best Regards,
        Marcos