作为主题,我必须编写一个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/htmlrnrn";
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脚本,有人能帮我推理吗?
这里有几个快速改进
打开文件时使用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
尽管说实话,您应该考虑使用TemplateToolkit或其他模板引擎。
在Perl中,您使用eq运算符来测试字符串等价性,所以我认为这个
if $cell == 'pippo' {
应该是这个吗
if($cell eq 'pippo') {
最后,在脚本中很常见的是,您逐行解析文件以使用chomp
,这将从您刚刚读取的行中删除一个尾随的换行符,例如
while ($line=<F>)
{
chomp($line); #otherwise $line ends in n
希望这足以让你开始,祝你好运!
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文件上的方式,以满足您的特定需求。