【发布时间】:2009-12-22 10:40:59
【问题描述】:
美好的一天。
我的文本文件内容如下。 tmp.txt(一个非常大的文件)
constant fixup private AlarmFileName = <A "C:\\TMP\\ALARM.LOG"> /* A Format */
constant fixup ConfigAlarms = <U1 0> /* U1 Format */
constant fixup ConfigEvents = <U2 0> /* U2 Format */
我的解析代码如下。
该代码无法在此处处理C:\\TMP\\ALARM.LOG(带引号的字符串)。
我不知道如何替换代码 "s+([a-zA-Z0-9])+>" 来处理 [a-zA-Z0-9] (0 above) 字符串和 quated 字符串 (" C:\TMP\ALARM.LOG" 以上)。
$source_file = "tmp.txt";
$dest_xml_file = "my.xml";
#Check existance of root directory
open(SOURCE_FILE, "$source_file") || die "Fail to open file $source_file";
open(DEST_XML_FILE, ">$dest_xml_file") || die "Coult not open output file $dest_xml_file";
$x = 0;
print DEST_XML_FILE "<!-- from tmp.txt-->\n";
while (<SOURCE_FILE>)
{
&ConstantParseAndPrint;
}
sub ConstantParseAndPrint
{
if ($x == 0)
{
if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([a-zA-Z0-9])+>\s*(\/\*\s*(.*?)\s*\*\/|)(\r|\n|\s)/)
{
$name1 = $1;
$name2 = $2;
$name3 = $3;
$name4 = $4;
$name5 = $5;
$name6 = $6;
$name7 = $7;
printf DEST_XML_FILE "\t\t$name1";
printf DEST_XML_FILE "\t\t$name2";
printf DEST_XML_FILE "\t\t$name3";
printf DEST_XML_FILE "\t\t$name4";
printf DEST_XML_FILE "\t\t$name5";
printf DEST_XML_FILE "\t\t$name6";
printf DEST_XML_FILE "\t\t$name7";
$x = 1;
}
}
}
感谢您的意见。
**大家好,
感谢您提供这么多出色的解决方案。我是新手,我想根据你的帖子做更多的研究。
非常感谢。**
【问题讨论】:
-
你想达到什么目标,出了什么问题?
-
您好 n0rd,我不知道如何替换代码“s+([a-zA-Z0-9])+>”来处理 [a-zA-Z0-9] (上面的 0)字符串和带引号的字符串(上面的“C:\TMP\ALARM.LOG”)。
-
清楚地描述你想要什么。在提出此类问题时显示您想要的示例输出。
-
@ghostdog74。更新了我上面的帖子。谢谢。
-
你的
$name1 = $1系列已经告诉我你走错了路。如果你必须用数字后缀命名一个变量,它确实是更大数据结构的一部分。