我有一个perl
脚本,用于从文件中读取数据,然后将其打印到linux
上的自定义颜色终端。它一次读取一行文件。该文件包含有关人类属性(first name, last name, eye color
)后跟十六进制消息的消息。
问题:最后一个属性或文件中只有一个属性时会出现问题。它将读入数据而不是将其打印到自定义终端。
以下是我在文件中无法使用的示例:
Message Type: Human Attribute
First Name: John
Last Name: Snow
Eye color: brown
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
十六进制消息中的最后一行是文件中的最后一行..这是我正在使用的代码:
package Lib::HumanAttributeMessageProcessing;
use Exporter;
@ISA = ('Exporter');
@EXPORT = qw(&readRecord &initializeReader);
sub initializeReader {
$messageHandler = shift;
$fileHandlers{$messageHandler} = shift;
}
sub readRecord {
my $mH = shift;
my $fH = $fileHandlers{$mH};
my $remaingLine = $lastLines{$mH};
$lastLines{$mH} = undef;
my %jRecord = ();
unless ($remainingLine) {
$lastLines{$mH} = undef;
return;
}
if ($remainingLine =~ /Message Type:\s+([a-zA-Z0-9_]+)/) {
$jRecord{"TYPE"} = $1;
}
$state = 0;
while (<$fH>) {
if (!state && /Message Type:\s+([a-zA-Z0-9_]+)/) {
$jRecord{"TYPE"} = $1;
} elsif (!state && /First Name:\s+([a-zA-Z_]+)/) {
$jRecord{"FIRSTNAME"} = $1;
} elsif (!state && /Last Name:\s+([a-zA-Z_]+)/) {
$jRecord{"LASTNAME"} = $1;
} elsif (!state && /EYECOLOR:\s+([a-zA-Z_]+)/) {
$jRecord{"EYECOLOR"} = $1;
} elsif (/^a[a-f\d]{2}/) {
chomp;
$jRecord {"HEX"} .= $_ . " ";
$state = 1;
} elsif ($state){
$lastLines{$mH} = $_;
last;
} else {
print STDERR "SKIPPING LINE: $_\n";
}
}
\%jRecord;
}
我注意到它读取了十六进制消息中的最后一行,但从未退出while循环。此代码位于其自己的文件中,名为HumanAttributeMessageProcessing.pm。它由另一个perl脚本文件调用。以下是调用文件的脚本代码:
#!/usr/bin/perl -w
use lib "./";
use Lib::HumanAttributeMessageProcessing;
use FileHandle;
%count = ();
$log = shift @ARGV;
open PIPE "tail -f -n +0 $log |"
or die "Cannot open pipe\n";
initializeReader("1", \*PIPE\n";
$count = 1;
STDOUT->autoflush;
PIPE->autoflush;
while(1)
{
$record = readRecord("1");
if(defined($record))
{
$MSGType = getMessageType($record);
$count{sprintf, "%s", $MSGType}++;
system("clear");
print "Summary:\n";
$total = 0;
foreach $key (sort keys %count)
{
$value = $count{key};
printf "# %-55s # %7s #\n", $key, $value;
$total += $value;
printf "# %-55s # %7s #\n", $total;
}
}
}
非常感谢任何帮助!