问一个关于perl 正则表达式的问题

问一个关于perl 正则表达式的问题

问一个关于perl 正则表达式的问题
我是perl新手,现在有一个这样的问题:
我有一个文件内容是这样的:
$(WORKDIR)\obj\flash.obj : $(ROOTDIR)\utils\fl\flash.c
$(CC1) $(CCOPTAP) -o $(WORKDIR)\obj\flash.obj $(ROOTDIR)\utils\fl\flash.c
现在我只想提取一次“$(ROOTDIR)\utils\fl\flash.c”,并把它换成“..\utils\fl\flash.c”

我的代码如下面这样:
#!/usr/bin/perl -w

open TXTFILE,"source.txt" || die "$!";
open FMTFILE,">result.txt" || die "$!";

while ($singleLine=<TXTFILE>)
{
chomp $singleLine;
if ($singleLine =~ /\$\(ROOTDIR\)(.+?)\.c$/)
{
$singleLine=~ s!\$!!;
$singleLine=~ s!\(ROOTDIR\)!..!;
printf FMTFILE "$singleLine\n";
}
}

close TXTFILE;
close FMTFILE;

可是最后并没有得到我想要的结果,请各位帮我分析,谢谢。
“只想提取一次”是什么意思?
不知道你说的”只想提取一次“是什么意思,但你的模式匹配可能有问题,
$singleLine =~ /\$\(ROOTDIR\)(.+?)\.c$/的意思应该是在字符串尾匹配”$(ROOTDIR).+?.c“。似乎不能达到要求。下面一个程序也许可以解决问题。
-----------------------------------------------------
#!/usr/bin/perl -w
open TXTFILE,"source.txt" || die "$!";
open FMTFILE,">result.txt" || die "$!";

while ($singleLine=<TXTFILE>)
{
chomp $singleLine;
if ($singleLine =~ s/\$\(ROOTDIR\)\\utils\\fl\\flash\.c/\.\.\\utils\\fl\\flash\.c/)
{
printf FMTFILE "$singleLine\n";
}
}

close TXTFILE;
close FMTFILE;
Sorry,我没有说清楚!
1、我这个文件里有很多类似的内容,不单单是一个.c文件,我的目的是将他们都提取出来;
2、而且只提取一次(因为按照我的那个模式匹配,两次都会取到);
我搞定了。^_^
比较笨的方法!