Re: Problem with replacing string in file
- From: info@xxxxxxxxxxxx (D. Bolliger)
- Date: Sat, 25 Nov 2006 14:59:00 +0100
perl pra am Samstag, 25. November 2006 13:40:
hi Gurus,[...]
I have a problem to replace strings of file thru perl script.
I have a text file some thing like this..[...]
PROJ_FOLER=C:\Proj
PROJ_LOGS=C:\PROJ\LOGS
I have same line in config file some thing like this.
PROJ_FOLDER=D:\Proj
PROJ_LOGS=D:\PROJ\LOGS.
Here is the code i have written...
Hi perl pra
I did not test your code, and won't present a solution, because I think it is
more helpful to make you think about what you coded, and how you can simplify
coding, and then you will find the solution yourself :-)
#!/usr/bin/perl
Never forget:
use strict;
use warnings;
you have to declare all variables now, and will see warnings and hints about
possible error sources.
my $config_path="E:/MessageArchive/WorkArea/config.txt";
$file="E:/temp/FT/config/FTMessageArchive.configd";
open FH, "$config_path";
Replace the couble qoutes with single qoutes in the first two lines, no
variable is interpolated; in the third, a variable without any static text is
unnecessarily interpolated, so you can omit quoting at all.
Note the usage of FH and $LOGFILE as file handles. In newer style, use a
variable:
open my $fh, '<', $config_path or die $!;
while ($line=<FH>) {
my ($key,$val)= $line =~ /^(\w+)=(.+)$/mg ;
The test if the matching succeeded is missing. Your data may be proper
formatted or not. If not, $key and $val will be undefined, leading to
unexpected results in the following code. Never assume properly formatted
input data.
You only read one line, so the /m modifier is useless.
A data line, I assume, should only have one 'X=Y', so the /g modifier is a bit
strange. You may want to handle unexpected data lines in some way.
$repline="$key=$val";
You break $line into parts and then put it together in $repline again. I don't
see at the moment what's the sense behind it?!
open $LOGFILE, '<', $file;
*Always* check:
open $LOGFILE, '<', $file or die $!; # even better: more verbose msg
while ($line1 = <$LOGFILE> ) {
if ($line1 =~ m/$key/){
system("perl -i.bak -p -e 's/$line1/$repline/g' $file");
*Always* check. system returns 0 on success.
Then, the error messages you get, indicate that the code given to system
contains some errors. What to do? Simply print out it to see what you pass to
system. Eventually run the code directly in the shell.
You deal with user provided input here that is passed to the shell. So be
*very* cautious about what is executed, and consider malicious input data.
Also note that you are in a while loop stepping through $file, and you try to
modify $file via system. Generally it's a bad idea to alter something you're
looping through.
close $LOGFILE;
*Always* check.
last;
}
}
}
close(FH);
*Always check.
END _____________[...]
if i run the script I am getting the following errror..
Can't find string terminator "'" anywhere before EOF at -e line 1.
Can't find string terminator "'" anywhere before EOF at -e line 1.
Can't find string terminator "'" anywhere before EOF at -e line 1.
What am i doing wrong?
The most important point I think is that you should check as much as possible
and assume as less as possible :-)
Then, as a next step, you may consider a redesign. Consider (poor pseudocode):
while ...{
while ...{
system...
}
}
I don't know how many lines your files contain, but system could be executed
numerous times, every time creating a new process!
Dani (nonguru)
.
- References:
- Problem with replacing string in file
- From: Perl Pra
- Problem with replacing string in file
- Prev by Date: Re: Problem with replacing string in file
- Next by Date: Re: perl string substitution
- Previous by thread: Re: Problem with replacing string in file
- Next by thread: Re: Problem with replacing string in file
- Index(es):
Relevant Pages
|