[英]How to modify a perl script to read excel instead of Html files
我的第一个问题是:
这是否可能做到这一点,因为现在我有一个 perl 脚本,它读取 Html 文件并提取数据以显示在另一个 html 文件上。
如果上述问题的答案是肯定的,那么我的第二个问题将是:
这该怎么做?
很抱歉坦率地问这个问题,但由于我对 perl 很陌生,我必须接受这项任务,所以我在这里寻求一些有用的建议或建议来指导我完成这项任务。 提前感谢您的帮助。
这是代码的一部分,因为整个块很长:
$date=localtime();
($TWDAY, $TMTH, $TD1D, $TSE, $TYY) = split(/\s+/, $date);
$TSE =~ s/\://g;
$STAMP=_."$TD1D$TMTH$TYY";
@ServerInfo=();
#--------------------------------------------------------------------------- -------------------------------
# Read Directory
#----------------------------------------------------------------------------------------------------------
$myDir=getcwd;
#----------------------------------------------------------------------------------------------------------
# INITIALIZE HTML FORMAT
#----------------------------------------------------------------------------------------------------------
&HTML_FORMAT;
#----------------------------------------------------------------------------------------------------------
# REPORT
#----------------------------------------------------------------------------------------------------------
if (! -d "$myDir/report") { mkdir("$myDir/report");};
$REPORTFILE="$myDir/report/checkpack".".htm";
open OUT,">$REPORTFILE" or die "\nCannot open out file $REPORTFILE\n\n";
print OUT "$Tag_Header";
#----------------------------------------------------------------------------------------------------------
sub numSort {
if ($b < $a) { return -1; }
elsif ($a == $b) { return 0;}
elsif ($b > $a) { return 1; }
}
@ArrayDir = sort numSort @DirArray;
#while (<@ArrayDir>) {
@OutputDir=grep { -f and -T } glob "$myDir/*.htm $myDir/*.html";
#}
#----------------------------------------------------------------------------------------------------------
@ReadLine3=();
$xyxycnt=0;
foreach $InputFile (@OutputDir) { #---- MAIN
$filename=(split /\//, $InputFile) [-1]; print "-"x80 ; print "\nFilename\t:$filename\n";
open IN, "<$InputFile" or die "Cannot open Input file $InputFile\n";
@MyData=();
$DataCnt=0;
@MyLine=();
$MyLineCnt=0;
while (<IN>) {
$LINE=$_;
chomp($LINE);
$LINE=~s/\<br\>/XYXY/ig;
$LINE=~s/\<\/td\>/ \nXYZXYZ\n/ig;
$LINE=~s/\<dirname\>/xxxdirnameyyy/ig;
$LINE=linetrim3($LINE);
$LINE=linetrim($LINE);
$LINE=~s/XYXY/\<br\>/ig;
$LINE=~s/xxxdirnameyyy/< dirname >/ig;
$LINE=~s/^\s+//ig;
print OUT2 "$LINE\n";
if (defined($LINE)) { $MyData[$DataCnt]="$LINE"; $DataCnt++ ; }
}
close IN;
foreach $ReadFile (@MyData) { #--- Mydata
$MyLineCnt++;
$MyLine[$MyLineCnt]="";
#### FILENAME
$ServerInfo[0]="$filename";
#### IP ADDRESS
if ($ReadFile =~ /Host\/Device Name\:/) {
#print "$ReadFile\n"
($Hostname)=(split /\:|\s+/, $ReadFile)[3]; print "$Hostname\n";
&myServerInfo("$Hostname","1");
}
if ($ReadFile =~ /IP Address\(es\)/) {@ListIP=(); $SwIP=1; $CntIP=0 ; };
#### OPERATING SYSTEM & VERSION
if ($ReadFile =~ /Operating System\:/) {
$SwIP=0;
$OS= (split /\:|\s+/, $ReadFile)[3]; &myServerInfo("$OS","3") ; print "$OS\n";
$OSVer= (split /\:|\s+/, $ReadFile)[-2]; &myServerInfo("$OSVer","4") ; print "$OSVer\n";
};
#### GET IP VALUE
if ($SwIP==1) {
$ReadFile=(split /\:/,$ReadFile) [2];
$ReadFile=~s/[a-z|A-Z]|\(|\)|\// /ig; print "$ReadFile\n";
if ($CntIP==0) {
#$ListIP[$CntIP]=(split /\s+/,$ReadFile) [1];
@ListIP="$ReadFile";
} elsif ($CntIP==1) { print "\n\t\t $ReadFile\n" ; $ListIP[$CntIP]="\n$ReadFile";
} else { print "\t\t $ReadFile\n" ; $ListIP[$CntIP]="\n$ReadFile"; };
$CntIP++;
}
恐怕如果您不了解该程序中发生的事情,并且根本不了解如何处理这样的任务,Stack Overflow 可能不是寻求帮助的正确地方。
让我尝试向您展示我将采用的方法。 我假设有更多的代码。
还要在重构时添加use strict
和use warnings
以更轻松地捕获错误。 如果事情因此而中断,请在继续之前使其工作。 这些 pragma 会告诉您出了什么问题。 您将遇到的最常见的一种是全局符号“$foo”需要明确的包名称。 这意味着您需要将my
放在第一个赋值的前面,或者在此之前声明变量。
如果您有具体问题,请用一个简短的示例将它们作为新问题提出。 阅读如何提出要求以确保您能得到这些方面的帮助。
祝你好运!
看到您的评论后,我认为您想要不同的输入和不同的输出。 在这种情况下,忽略这一点,扔掉旧代码并从头开始。 如果您对 Perl 的了解还不够多,那么如果您已经了解编程,那么请阅读 Curtis Poe 的Beginning Perl 之类的书。 如果没有,请查看 Randal L. Schwartz 的Learning Perl 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.