Perfecting index.pl some more!



Here is how my script has been transformed thanks to your precious precious suggestions and mine's minor alternation:

#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
use CGI::Cookie;
use DBD::mysql;
use DBI;
use POSIX qw(strftime);

print header( -charset=>'iso-8859-7' );
print start_html( -style=>'../data/css/style.css', -title=>'Øõ÷ùöåëÞ Ð
+íåõìáôéêÜ Êåßìåíá!', -background=>'../data/images/night.gif' );

my ($sth, $row);
my $date = strftime( "%d %b, %H:%M", localtime );
my $host = $ENV{'REMOTE_HOST'};
$host = "Íßêïò" if ( ($host eq "dell") or ($host eq "localhost") or ($
+host ~= /vivodi.gr/) );

my $dbh = ($ENV{'SERVER_NAME'} ne 'nikolas.50free.net')
        ? DBI->connect('DBI:mysql:nikos_db',            'root',     'c
+ensored')
        : DBI->connect('DBI:mysql:nikos_db:50free.net', 'nikos_db', 'c
+ensored')
        or {RaiseError=>1};

#*********************************************************************
+**********

my @files = <../data/text/*.txt>;
my @display_files = map( /([^\/]+)\.txt/, @files );

print start_form(-action=>'index.pl');
      print p( {-align=>'center'}, font( {-size=>5, -color=>'Lime'}, '
+ÄéÜëåîå Ýíá áðü ôá êåßìåíá ãéá íá äéáâÜóåéò => ' ),
                                   popup_menu( -name=>'select', -value
+s=>\@display_files ),
                                   submit('ÅðéëïãÞ'));
print end_form(), br();

my %sql = (
    get_counter    => "SELECT counter FROM visitorlog",
    get_host       => "SELECT host FROM visitorlog WHERE host=?",
    update_visitor => "UPDATE visitorlog SET counter+=1 WHERE host=?",
    update_passage => "UPDATE visitorlog SET passage=? WHERE host=?",
    insert_host    => "INSERT INTO visitorlog (null, host, date, passa
+ge, counter) VALUES (?, ?, ?, ?, ?, ?)"
);

my $passage = param('select') || "Áñ÷éêÞ Óåëßäá!";
my ($data, @data);


if (param('select') and param('select') != '..') { open(FILE, "<../data/text/$passage.txt") or die $!; @data = <FILE>; close(FILE);

    $data = join('', @data);

    $sth = $dbh->prepare( $sql{update_passage} );
    $sth->execute($passage, $host);
}
else
{
    my $sth = $dbh->prepare( $sql{get_host} );
    $sth->execute($host);

    if ($sth->rows)
    {
        $sth = $dbh->prepare( $sql{update_visitor} );
        $sth->execute($host);

        $sth = $dbh->prepare( $sql{get_host} );
        $sth->execute($host);

        $row = $sth->fetchrow_hashref;
        $data = "Êáëþò Þëèåò " .$host. "! ×áßñïìáé ðïõ âñßóêåò ôçí óåë
+ßäá åíäéáöÝñïõóá!\n" .
                "Ôåëåõôáßá öïñÜ Þñèåò åäþ ùò " .$row->{host}. " óôéò "
+ .$row->{date}. " !!\n" .
                "ÓýíïëéêÝò Þñèåò åäþ " .$row->{counter}. " öïñÝò!!!\n"
+ .
                "Ôåëåõôáßá åßäåò ôï êåßìåíï { " .$row->{passage}. " }\
+n" .
                "Ðïéü êåßìåíï èá ìåëåôÞóåòé áõôÞí ôçí öïñÜ !?";
    }
    else
    {
        if ($host ne "Íßêïò")
        {
            $data = "ÃåéÜ óïõ " .$host. "!\n" .
            "¸ñ÷åóáé ãéá 1ç öïñÜ åäþ !!\n" .
            "Åëðßæù íá âñåßò ôá êåßìåíá åíäéáöÝñïíôá :-)";

            $sth = $dbh->prepare( $sql{insert_host} );
            $sth->execute(null, $host, $date, $passage, $counter);
        }
        else
        {
            $data = "ÃåéÜ óïõ Íéêüëá, ôé ÷áìðÜñéá?! ¼ëá äåîéÜ íá óïõ ð
+Üíå ðÜíôá! ;-)";
        }
    }
}

$data =~ s/\n/\\n/g;
$data =~ s/"/\\"/g;
$data =~ tr/\cM//d;

#*********************************************************************
+**********
print <<ENDOFHTML;
<html><head><title></title>
<script type='text/javascript'>

var textToShow = "$data";
var tm;
var pos = 0;
var counter = 0;

function init()
{ tm = setInterval("type()", 45) }

function type()
{
    if (textToShow.length != pos)
    {
       d = document.getElementById("DivText");
       c = textToShow.charAt(pos++);

       if (c.charCodeAt(0) != 10)
          d.appendChild(document.createTextNode(c));
       else
          d.appendChild(document.createElement("br"));

       counter++;

       if (counter >= 1800 && (c.charCodeAt(0) == 10 || c == "."))
       {
          d.appendChild(document.createElement("br"));
          d.appendChild(document.createTextNode("Press any key..."));
          counter = 0;
          clearInterval(tm);
          document.body.onkeypress = function () {
          document.getElementById("DivText").innerHTML = '';

          tm = setInterval("type()", 50);
          document.body.onkeypress = null; };
       }
    }
    else
       clearInterval(tm);
}
</script>

<body onload=init()>
   <center>
   <div id="DivText" align="Left" style="
     background-image: url(../data/images/kenzo.jpg);
     border: Ridge Orange 5px;
     width: 850px;
     height: 500px;
     color: LightSkyBlue;
     font-family: Times;
     font-size: 18px;">
   </div
ENDOFHTML
#*********************************************************************
+**********

print br(), br(), br();
print start_form(-action=>'show.pl');
print table( {class=>'user'},
      Tr( td(    'Ðþò óå ëÝíå áäåëöå?'
+   ),     td( textfield( 'name' ))),
      Tr( td(    'ÐïéÜ åßíáé ç ãíþìç óïõ ãéá ôçí åõ÷ïýëá
                  »Êýñéå Éçóïý ×ñéóôÝ, ÅëÝçóïí Ìå« ?'
+   ),     td( textarea( -name=>'pray', -rows=>4, -columns=>25 ))),
      Tr( td(    'ÐåñéÝãñáøå ìáò ìéá ðñïóùðéêÞ óïõ
                  ðíåõìáôéêÞ åìðåéñßá áðü êÜðïéïí ãÝñïíôá ðñïò
                  þöåëïò ôùí õðïëïßðùí áäåëöþí ( áí öõóéêÜ Ý÷åéò :-)'
+   ),     td( textarea( -name=>'remark', -rows=>6, -columns=>25 ))),
      Tr( td(    'Ðïéü åßíáé ôï email óïõ?'
+   ),     td( textfield( 'email' ))),
      Tr( td(     submit( 'ÅìöÜíéóç üëùí ôùí áðüøåùí'
+   )),    td( submit( 'ÁðïóôïëÞ' ))),
);
print end_form(), br(), br();

open(FILE, "<../data/text/tips") or die $!;
     my @tips = <FILE>;
close(FILE);

@tips = grep { !/^\s*\z/s } @tips;
my $tip = $tips[ int(rand(@tips)) ];

print table( {class=>'tip'},  Tr( td( {class=>'tip'}, $tip ))), br();

$sth = $dbh->prepare( $sql{update_counter} ) if ($host ne "Íßêïò");
$sth->execute;

$sth = $dbh->prepare( $sql{get_counter} );
$sth->execute;

#here i decided to add together all the times visitors visit
#my webpage so to get a total counter in order to avoid
#create a new mysql table called counters and store that
#value there. Or even to a flat file!
while ($row = $sth->fetchrow_hashref)
{
    $counter += $row->{counter};
}

print table( {class=>'info'},
        Tr( td( {class=>'host'},     $host )),
        Tr( td( {class=>'date'},     $date )),
        Tr( td( {class=>'counter'},  $counter ))
);

print br(),                  a( {href=>'games.pl'}, img{src=>'../data/
+images/games.gif'} );
print p( {-align=>'right'},  a( {href=>'show.pl?name=showlog'},  font(
+ {-size=>2, -color=>'Lime'},  b( 'Last Update: 30/4/2005' ))));


How i can i shorter it, perfect it some more by dividing into subs? What must be/not be in a sub? .