0

As subject, I have to write a perl script that transforms a log file like:

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

In this html table format:

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

Now I have write this little perl script, but I've problem to create the write cycle, from the @cells array:

#! /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>";

This is my first long perl script, can someone help me in reasoning?

4

2 回答 2

1

您可以在此处进行一些快速改进

打开文件时使用 3 参数 open 更安全,因此您不会意外打印到文件

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

多行打印语句有点难以阅读。通常的做法是使用here-doc来定义多行字符串,如下所示

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 中,您使用 eq 运算符来测试字符串等价性,所以我认为这

if $cell == 'pippo' {

应该是这个

if($cell eq 'pippo') {

最后,在脚本中很常见的是您逐行解析文件以使用chomp,这将从您刚刚阅读的行中去除尾随换行符,例如

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

希望这足以让你开始,祝你好运!

于 2013-04-30T15:57:56.960 回答
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 文件的方式以满足您的特定需求。

于 2013-05-01T06:22:03.503 回答