【发布时间】:2013-12-10 18:13:10
【问题描述】:
我在一个文件中有这个 xml 代码 sn-p,我想使用 perl 将其注释掉。
<plugin id="InvalidObjectsCheck"
description="Verifying No Database Invalid Objects Exist"
invoke=""
plugin.class="oracle.check.apps.InvalidObjectsCheckPlugin"
class.path="$HC_LOCATION/lib/precheckplugin.jar;
$HC_LOCATION/lib/hccommon.jar;
$APPLICATIONS_BASE/fusionapps/applications/lcm/ad/java/adjava.jar"
stoponerror="false"/>
不幸的是,其他 DTD 的结束标记 (stoponerror="false"/>) 也是如此。我为此编写了一个子例程,但不知道在读取文件的全部内容后如何继续。
sub skip_lp_hc($skiplphc)
{
$hcfile = "${sharedStorageLoc}${fs}${podName}${fs}${releaseTo}${fs}fusionapps${fs}applications${fs}lcm${fs}hc${fs}config${fs}ga${fs}GeneralSystemHealthChecks.xml";
if(! -e "$hcfile")
{
print "[ERROR]: Unable to locate the manifest file : GeneralSystemHealthChecks.xml\n";
print "[INFO] : Located at ${sharedStorageLoc}${fs}${podName}${fs}${releaseTo}${fs}fusionapps${fs}applications${fs}lcm${fs}hc${fs}config${fs}ga\n";
}
if($skiplphc eq true)
{
print "[SUCCESS] : Able to access GeneralSystemHealthChecks.xml\n";
print "[INFO] : ${sharedStorageLoc}${fs}${podName}${fs}${releaseTo}${fs}fusionapps${fs}applications${fs}lcm${fs}hc${fs}config${fs}ga\n";
open (IN, "<$hcfile") or die "Cannot open the file : $hcfile\n";
while (my $my_line = <IN> )
{
chomp $my_line;
$my_line =~ s/^\s+//;
$my_line =~ s/\s+$//;
if ($my_line =~ m/<plugin id="InvalidObjectsCheck"\=(.*)/)
{
print "[INFO] : Found a match for <plugin id=InvalidObjectsCheck after accessing GeneralSystemHealthChecks.xml\n";
}
}
close (IN);
}
}
【问题讨论】:
-
我假设
${fs}是您的“字段分隔符”?这不是很可读。您应该考虑改用join。或者,如果这是您正在处理的路径,请使用适当的模块,例如来自File::Spec的catfile。 -
请把缺少的动词填入很遗憾,其他DTD的结束标记(stoponerror="false"/>)也是。
-
另外:
if($skiplphc eq true)是一种检查真实值的可怕方法。if ($skip)是您所需要的,使用eq将使检查更加严格。你已经宣布你的子程序非常错误,sub skip_lp_hc($skiplphc) {应该是sub skip_lp_hc { my ($skip_lp_hc) = @_;