作为主题,我必须编写一个perl脚本来转换日志文件,如下所示:
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表格格式中:
链接: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脚本,有人能帮助我进行推理吗?
发布于 2013-04-30 23:57:57
这里有几个可以快速改进的地方
在打开文件时使用3个参数open会更安全,这样就不会意外地打印到文件中
open(my $fh, '<', $file) or die("Could not open $file");多行的print语句读起来有点困难。通常使用-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不过,老实说,你应该考虑使用模板工具包,或者其他模板引擎。
在Perl中,您使用eq运算符来测试字符串的等价性,所以我认为
if $cell == 'pippo' {应该是这样的
if($cell eq 'pippo') {最后,在脚本中常见的是逐行解析文件以使用chomp,这将从您刚刚读到的行中去掉尾随的换行符,例如
while ($line=<F>)
{
chomp($line); #otherwise $line ends in \n希望这足以让你入门,祝你好运!
发布于 2013-05-01 14:22:04
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文件的方式,以满足您的特定需求。
https://stackoverflow.com/questions/16303132
复制相似问题