wolverina has asked for the wisdom of the Perl Monks concerning the following question:

I'm processing a file by substituting a few words. The file being processed is a script. The problem is that after it's been processed, it's no longer formatted. Htm files display even if not formatted, but the script gives a server error. If i manually reformat the file back to it's orginal state with lines starting on the left side, it works. My question is, any idea's on how to retain the format, or reformat the file inside the script?

Here's the code that processes:

open (FILE,"$FORM{'TextFile'}"); @LINES = <FILE>; close (FILE); $text = join(' ',@LINES); $text =~ s/\n/ /g; foreach $variable (@variables) { if ($FORM{$variable} eq "") { print "incomplete!\n"; exit; } $text =~ s/<!--$variable-->/<STRONG>$FORM{$variable}<\/STRONG> +/g; } $text =~ s/A\/an <STRONG>(a|e|i|o|u)/An <STRONG>$1/g; $text =~ s/a\/an <STRONG>(a|e|i|o|u)/an <STRONG>$1/g; $text =~ s/A\/an/A/g; $text =~ s/a\/an/a/g; print $text;

Thanx, Lisa

Edited: ~Thu Aug 8 15:44:21 2002 (GMT) by footpad: Replaced <PRE> tags with proper HTML formatting, per Consideration.

Replies are listed 'Best First'.
Re: Keep file formatted
by katgirl (Hermit) on Aug 08, 2002 at 10:51 UTC
    This is the problem: $text = join(' ',@LINES); That jams all your text together in one long line, so when it comes out it looks like a mess. How about this:
    open (FILE,"$FORM{'TextFile'}"); @LINES = <FILE>; close (FILE); chomp(@LINES); foreach $line (@LINES) { foreach $variable (@variables) { if ($FORM{$variable} eq "") { print "incomplete!\n"; exit; } $line =~ s/<!--$variable-->/<STRONG>$FORM{$variable}<\/STRONG>/g; } $line =~ s/A\/an <STRONG>(a|e|i|o|u)/An <STRONG>$1/g; $line =~ s/a\/an <STRONG>(a|e|i|o|u)/an <STRONG>$1/g; $line =~ s/A\/an/A/g; $line =~ s/a\/an/a/g; print "$line\n"; }

      And, of course, you could move the check on the @variables outside the processing loop. Then you'll get an error, and no output, rather than half the output and an error. Also, the filename really, really ought to be validated in someway, in case somebody submits (for example) "> /etc/passwd", which would promptly attempt to erase your password file (I'm only going to force the file to be opened for reading, which still isn't adequate, but it's an improvement).

      foreach $variable (@variables) { die "Incomplete $variable\n" if $FORM{$variable} eq ""; } open FILE, "< $FORM{'TextFile'}" or die "Cannot open TextFile $FORM{'TextFile'}"; foreach $line (<FILE>) { foreach $variable (@variables) { $line =~ s/<!--$variable-->/<STRONG>$FORM{$variable}<\/STRONG>/g; } $line =~ s/A\/an <STRONG>(a|e|i|o|u)/An <STRONG>$1/g; $line =~ s/a\/an <STRONG>(a|e|i|o|u)/an <STRONG>$1/g; $line =~ s/A\/an/A/g; $line =~ s/a\/an/a/g; print "$line\n"; } close FILE;

      --
      Tommy
      Too stupid to live.
      Too stubborn to die.

Re: Keep file formatted
by tadman (Prior) on Aug 08, 2002 at 11:00 UTC
    To simplify your regular expressions, you can use an alternate delimiter, such as:
    s#<FOO>#<B>Foo</B>#g;
    I try and use something that won't show up in the substitution, so that you don't have to backslash everything.
Re: Keep file formatted
by Dog and Pony (Priest) on Aug 08, 2002 at 10:59 UTC
    Well, you could not do this:
    $text =~ s/\n/ /g;
    and do the join on the line above with an empty string ('' instead of ' ').

    I don't know if you have any reasons for doing any of these things, but I couldn't see any offhand. That the substituted things could span several lines doesn't seem to fit with both that join and the substituion, but if it does, you could alter your regexps to something like:

    $text =~ s/A\/an(\s+)<STRONG>(a|e|i|o|u)/An$1<STRONG>$2/g;
    Which would deal with the possibilities of newlines and/or normal space between A/an and <STRONG>.

    I will let others point out that you should look into module X for this kind of thing - I really agree, but felt more like answering this question. :)

    Btw: Shouldn't that be "A/An" in that regexp, instead of "A/an"?


    You have moved into a dark place.
    It is pitch black. You are likely to be eaten by a grue.
Re: Keep file formatted
by Chady (Priest) on Aug 08, 2002 at 11:04 UTC

    Just an OT point:

    Is this running public? are you checking $FORM{'TextFile'} before using it? to see if someone is giving you a thescript?TextFile=/etc/passwd as a query for example?


    He who asks will be a fool for five minutes, but he who doesn't ask will remain a fool for life.

    Chady | http://chady.net/