我是搜索 for HF50(HF$HF),例如在"MyFile.txt“中,这样提取的数据必须保存到"save.txt”。"save.txt“上的数据现在又被提取出来,并在我的表中填充参数和输出。但是当我尝试这个代码时,我没有输出,而且"save.txt“是空的。
无论我输入什么,变量$HF都不被识别。请帮帮忙。
#! /usr/bin/perl
print "Content-type:text/html\r\n\r\n";
use CGI qw(:standard);
use strict;
use warnings;
my ($file,$line,$tester,$HF,$keyword);
my ($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$f10,$f11,$f12,$f13,$f14,$f15,$f16,$f17,$f18,$f19);
my $keyWord=param('keyword');
$HF=$keyWord;
my $infile='MyFile.txt';
my $outfile='save.txt';
open (my $inhandle, '<',$infile) or die "Can't open $infile:$!";
open (my $outhandle, '>', $outfile) or die "Can't open $outfile:$!";
while (my $line=<$inhandle>){
if ($line=~ m/HF$HF/i) {
print {$outhandle}$line;
print $line;
print "<HTML>";
print "<head>";
print "<body bgcolor='#4682B4'>";
print "<title>FUSION SHIFT REPORT</title>";
print "<div align='left'>";
print "<FORM METHOD='get' ACTION='http://Shielex.com/pe/mrigos/mainhead.html'>";
print "<b>SEACRH:</b>";
print "<INPUT TYPE='text' NAME='rec' SIZE='12' MAXLENGHT='40'>";
print "<INPUT TYPE='submit' value='go'>";
print "</form>";
print "<TABLE CELLPADDING='1' CELLSPACING='1' BORDER='1' bordercolor=black width='100%'>";
print "<TR>";
print "<td width='11%'bgcolor='#00ff00'><font size='2'>TESTER No.</td>";
print "<td width='10%'bgcolor='#00ff00'><font size='2'>DATE</td>";
print "<td width='11%'bgcolor='#00ff00'><font size='2'>DEVICE NAME</td>";
print "<td bgcolor='#00ff00'><font size='2'>TEST PROGRAM</td>";
print "<td width='10%'bgcolor='#00ff00'><font size='2'>SMSLOT</td>";
print "<td width='12%'bgcolor='#00ff00'><font size='2'>LOADBOARD</td>";
print "<td width='10%'bgcolor='#00ff00'><font size='2'>CATEGORY</td>";
print "<td width='13%'bgcolor='#00ff00'><font size='2'>ROOT CAUSE 1</td>";
print "<td width='13%'bgcolor='#00ff00'><font size='2'>ROOT CAUSE 2</td>";
print "</tr>";
print "<TR>";
$file='save.txt';
open(F,$file)||die("Could not open $file");
while ($line=<F>)
{
my @cells=($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$f10,$f11,$f12,$f13,$f14,$f15,$f16,$f17,$f18,$f19)= split ',',$line;
print "<TD bgcolor='#ADD8E6'><font size='2'>$f2</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f3</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f5</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f6</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f8</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f10</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f17</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f18</TD>";
print "<TD bgcolor='#ADD8E6'><font size='2'>$f19</TD>";
print "</tr>";
}
}
}
close F;
print "</TABLE>";
print "</body>";
print "<html>";=MyFile.txt data=
1,HF50,13-10月-08,04:17:53,761503 08,04 62,B 2761503BP22. DWP,DWP,DWP,校准
2,HF60,13-10月-08,04:17:53,761503 08,04 62,B 2761503BP22. DWP,DWP,DWP,校准
1,HF50,13-10月-08,04:17:53,761503 08,04 62,B 2761503BP22. DWP,DWP,DWP,校准
发布于 2008-10-20 14:44:49
您是否将此作为CGI脚本运行?在这种情况下,您可能没有打开写入文件的权限。您是否检查了错误日志以查看来自die的消息是否在其中?
您可能需要查看Perl CGI脚本的故障排除。通过所有的步骤而不跳过任何一步。当你陷入困境时,你得到了大部分你需要帮助我们帮助你的信息。
祝你好运:)
发布于 2008-10-20 09:23:46
你从不关闭$outfile,这样它就不会被冲红。但是也许您想要将数据存储在数组中而不是?
顺便说一句,您应该始终使用open()的三个参数形式,并且在使用CGI程序时也应该始终使用绝对路径,就像在许多情况下,“当前目录”不是您所认为的那样。
发布于 2008-10-20 16:44:19
首先,Perl的输出是自然缓冲的。因此,除非使用某种显式方法,否则无法保证物理文件有任何可读取的内容。正如有人提到的,你将不得不以某种方式刷新输出。我的评论在下面的代码中。(您还可以通过关闭输出文件,并在读取输出文件之后以附加模式打开它。)
第二,你似乎不想做你想做的事。如果所有内容都被完美地刷新到了文件中,那么您将在每个输入行请求一个html头。因此,当我在输入中添加行时,它打印出了许多搜索框。我不认为这是你想要的。
下面是一段更加perl化的代码:
use CGI qw(:standard);
use IO::File;
use strict;
use warnings;
my ($file,$line,$HF); #,$tester,$HF,$keyword);
# don't pollute -> my ($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$f10
# ,$f11,$f12,$f13,$f14,$f15,$f16,$f17,$f18,$f19);
# my $keyWord=param('keyword'); <-- if you're not going to do anything with $keyWord
$HF=param('keyword'); # <- assign it to the variable you're going to use
my $infile='MyFile.txt';
my $outfile='save.txt';
open (my $inhandle, '<',$infile) or die "Can't open $infile:$!";
open (my $outhandle, '>', $outfile) or die "Can't open $outfile:$!";
# this would flush -> my $outhandle = IO::File->new( ">$outfile" );
print q{Content-type:text/html
<HTML>
<head>
<title>FUSION SHIFT REPORT</title>
<style type="text/css">
.header { background-color : #0f0; font-size : 12pt }
.detail { background-color : #ADD8E6; font-size : 12pt }
</style>
</head>
<body bgcolor='#4682B4'>
<div align='left'>
<FORM METHOD='get' ACTION='http://Shielex.com/pe/mrigos/mainhead.html'>
<b>SEACRH:</b>
<input type='text' name='rec' size='12' maxlenght='40'>
<input type='submit' value='go'>
</form>
<table cellpadding='1' cellspacing='1' border='1' bordercolor=black width='100%'>
<tr>
<td class="header" width='11%'>TESTER No.</td>
<td class="header" width='10%'>DATE</td>
<td class="header" width='11%'>DEVICE NAME</td>
<td class="header" >TEST PROGRAM</td>
<td class="header" width='10%'>SMSLOT</td>
<td class="header" width='12%'>LOADBOARD</td>
<td class="header" width='10%'>CATEGORY</td>
<td class="header" width='13%'>ROOT CAUSE 1</td>
<td class="header" width='13%'>ROOT CAUSE 2</td>
</tr>
};
my $hf_str = ",HF$HF,";
# OO -> $outhandle->autoflush(); <- set autoflush
while (my $line=<$inhandle>){
next unless index( $line, $hf_str ) > -1;
# OO -> $outhandle->print( $line );
# $outhandle->flush(); <- if autoflush not set, do it manually
print *{$outhandle} $line;
print "<tr>"
, ( map { qq{<td class="detail">$_</td>} }
split ',', $line
)
, "</tr>\n"
;
}
print q{
</table>
</body>
</html>
};https://stackoverflow.com/questions/217769
复制相似问题