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

Hi there,
I am using perl CGI and DBI to access my MySQL database. The problem is I have stored paths in the database, which, when retrieved I had hoped I could associate with filehandle, open and display in the browser. However, when I use a while loop to go through the file it disappears the newlines ! \n

I am also having problems getting it to use Courier font in my Linux/RedHat/Netscape browser.

This section of code is where I open the file (path stored in $data_from_MySQLdb) and it opens and prints to the browser - but as one long line, all the original file whitespace and new lines are lost.

my ($data_from_MySQLdb); $sth->bind_columns(undef,\$data_from_MySQLdb); while($sth->fetch()){ open(MYTREEFILE,"$data_from_MySQLdb") or die; while(<MYTREEFILE>){ print STDOUT "$_"; } }
Any ideas ? Am I messing up my using perl with html in some way ?
Cheers,
basm101

Replies are listed 'Best First'.
Re: CGI/MySQL and the vanishing \n
by pfaut (Priest) on Feb 04, 2003 at 16:13 UTC

    In order to help you, we're going to need to see the HTTP headers you send and any HTML that goes out before the file contents. Also, do the files contain plain text or HTML?

    I would guess you are using content-type of text/html but are expecting newlines in the file to act as newlines in the browser. Newlines are treated as whitespace by the browser when viewing text/html content unless wrapped in PRE tags.

    --- print map { my ($m)=1<<hex($_)&11?' ':''; $m.=substr('AHJPacehklnorstu',hex($_),1) } split //,'2fde0abe76c36c914586c';
      Yes I am using
      print "Content-type:text/html\n\n";
      I was expecting newlines in the file to act as newlines in the browser.
      What does PRE mean ? I will try puttin PRE as a tag before
      I print out $_
      cheers

        If you are displaying plain text, use "Content-type: text/plain\n\n" instead. Otherwise, I would recommend finding an HTML primer.

        --- print map { my ($m)=1<<hex($_)&11?' ':''; $m.=substr('AHJPacehklnorstu',hex($_),1) } split //,'2fde0abe76c36c914586c';
        In HTML all newlines and multiple spaces are treated as a single space for display purposes. Thus:
        <p>This will look like this does below

        This will look like this does below

        The <PRE> tag means preformatted so

        <PRE> This retains the newlines </PRE>
        This
        retains
        the
        newlines
        

        You badly need to learn some HTML. You also need to escape the HTML special characters < > "" &

        sub escapeHTML { my ( $escape, $text ) = @_; return '' unless defined $escape ; $escape =~ s/&/&amp;/g; $escape =~ s/"/&quot;/g; $escape =~ s/</&lt;/g; $escape =~ s/>/&gt;/g; # these next optional escapes make text look the same when rendere +d in HTML # without wrapping in <pre> tags if ( $text ) { $escape =~ s/\t/ /g; # tabs to 4 sp +aces $escape =~ s/( {2,})/"&nbsp;" x length $1/eg; # whitespace e +scapes $escape =~ s/\n/<br>\n/g; # newlines to +<br> } $escape =~ s/([^\000-\177])/'&#' . (sprintf "%3d", ord $1) . ';'/e +g; return $escape; }

        So you need to do something like

        print "Content-type: text/html\n\n"; print "<pre>\n"; for (@data) { print escapeHTML($_); } print '</pre>'; sub escapeHTML { ..... }

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print