2013-04-30 4 views
0

В теме, я должен написать сценарий PERL, который преобразует файл журнала как:Как Создание HTML таблицы из форматированного текста

pippo 2 64 0 2 
pippo_a 3 24 0 2 
Pippo_b 2 60 0 23 
pluto 0 18 0 4 
pluto_a 8 25 0 6 

paperino 0 11 1 7 
paperino_a 0 27 0 10 
coyote 0 29 0 7 
beepbeep 0 1 0 0 
tommy 3 31 0 27 
paperone 4 43 1 15 
paperone_a 4 52 0 13 
benjamin 0 21 1 35 

paperina 10 0 0 0 
papera 0 0 0 0 
quiquoqua 3 26 0 17 
quiquoqua_a 3 25 0 3 
pochaontas 0 12 0 68 

minnie 11 60 3 384 

В этом формате HTML таблицы:

LINK: http://imageshack.us/a/img90/7238/tabellao.jpg

Сейчас я пишу этот маленький PERL скрипт, но у меня проблемы, чтобы создать цикл записи, из массива @cells:

#! /usr/bin/perl 
print "Content-type:text/html\r\n\r\n"; 
use CGI qw(:standard); 
use strict; 
use warnings; 
use DateTime; 

my $line; 
my $file; 


$file='loggi.txt'; 
open(F,$file)||die("Could not open $file"); 


print "<html>\n 
<style type='text/css'>\n 
body {\n 
font-family: Verdana, Arial, Helvetica, sans-serif;\n 
color: #333;\n 
}\n 
table {\n 
font-size:11px;\n 
}\n 
td#vtl, td#pool {\n 
font-weight: bold;\n 
writing-mode: bt-rl;\n 
#-webkit-transform: rotate(90deg);\n 
#-moz-transform: rotate(90deg);\n 
#-ms-transform: rotate(90deg);\n 
#-o-transform: rotate(90deg);\n 
#transform: rotate(90deg);\n 
}\n 
.zone tr{\n 
border:2px dotted black;\n 
}\n 
</style>\n 
<body>\n 
<table border=2>\n 
<!--Intestazione-->\n 
<tr>\n 
    <th id='vtl'>houses</th>\n 
    <th id='pool'>id</th>\n 
    <th id='host'>name</th>\n 
    <th id='vergini'>Ver.(*)</td>\n 
    <th id='riciclabili'>(yes)</th>\n 
    <th id='vuote'>zero</th>\n 
    <th id='full'>Full</th>\n 
    <th id='spazi'>space</th>\n 
</tr>\n 
<!--Corpo-->\n 
<!--VTLA-->"; 
print "<tr align='center'>\n 
    <td id='case' rowspan=7>casaa</td>\n 
    <td id='id' rowspan=7>10</td>\n 
    <th id='a' colspan=5>pippi</th>\n 
    <td id='space' rowspan=30>0</td>\n 
</tr>"; 

while ($line=<F>) 
{ 
    print "<tr>"; 
    my @cells= split ' ',$line; 
    foreach my $cell (@cells) 
    { 
     if $cell == 'pippo' { 
     print "<td id='name'>$cell</td>"; 
     print "<td id='a'>$cell</td>"; 
     print "<td id='b'>$cell</td>"; 
     print "<td id='c'>$cell</td>"; 
     print "<td id='d'>$cell</td>"; 
    }} 
    print "</tr>"; 
} 
close(F); 
print "</table>\n 
<br/>\n 
Situazione aggiornata al".DateTime->now()->strftime("%a, %d %b %Y %H:%M:%S %z")." 
</body>\n 
</html>"; 

Это мой первый длинный скрипт perl, может кто-нибудь помочь мне в рассуждении?

ответ

1

Там есть несколько быстрых улучшений вы можете сделать здесь

Это безопаснее использовать 3 аргумента открытым при открытии файлов, поэтому вы не можете случайно распечатать в файл

open(my $fh, '<', $file) or die("Could not open $file"); 

Мульти Операторы печати строки немного трудно читать. Это обычная практика, чтобы использовать здесь-документ для определения многострочных строковых как так

print <<"EOT"; 
<html>\n 
<style type='text/css'>\n 
body {\n 
font-family: Verdana, Arial, Helvetica, sans-serif;\n 
color: #333;\n 
}\n 
table {\n 
font-size:11px;\n 
}\n 
td#vtl, td#pool {\n 
font-weight: bold;\n 
writing-mode: bt-rl;\n 
etc etc etc 
EOT 

Хотя, честно говоря, вы должны рассмотреть возможность использования Template Toolkit или другой шаблонизатор.

В Perl используется оператором э для проверки строки эквивалентности, так что я думаю, что это

if $cell == 'pippo' { 

должен быть этим

if($cell eq 'pippo') { 

Наконец, общепринятые в сценариях были разбор файл построчно по линии, чтобы использовать chomp, это отделит конечную новую строку от строки, которую вы только что прочитали, например

while ($line=<F>) 
{ 
    chomp($line); #otherwise $line ends in \n 

Надеюсь, этого достаточно, чтобы вы начали, удачи!

0
use strict; 
use warnings; 

use CGI qw(:all); 

my $cgi = new CGI ; 

my @header_array = ('<Header1>', 
        '<Header2>', 
        '<Header3>', 
        '<Header4>', 
        ); 

open (my $HTML, ">","index.html") or die $!; 
print $HTML $cgi->start_html("<Title>"); 
print $HTML "<link rel='stylesheet' href='<Path to css>' type='text/css' media='screen' />"; 

print $HTML $cgi->start_table({-border=>1, -cellspacing=>2, -cellpadding=>1}); 

print $HTML $cgi->Tr({-align=>'center',-valign=>'middle'},[$cgi->th(\@header_array)]); 

open (my $LOG, "<","log.txt") or die $!; 
foreach my $line (<$LOG>){ 
    my @row = split("\t",$line); 
    print $HTML $cgi->Tr({-align=>'center',-valign=>'middle'},[$cgi->th(\@row)]); 
} 
close ($LOG);  
print $HTML $cgi->end_table(); 
print $HTML $cgi->end_html(); 
close ($HTML);  

Вы можете изменить способ печати в html-файле в соответствии с вашими потребностями.