replace }else{ append to text file...?

I'm trying to read a text file, each line being a record with a unique name at the beginning, and comparing to a new input line. Based on whether the name of the record finds a match or not, either replace the matching line, otherwise append that line to the end of the file. Also to delete a line if indicated.

I've played with some code I found, but the results are either it duplicates the lines read in and appends them all, or it just writes the same (new) line out for every record.

I won't muck things up with the code I've started with, I want a fresh start, but basically it needs to look like:

file content example:
name=value|value|value|value|...continues....
monkey=something|anotherthing|anything|........
bear=problem|anything|manythings|duplicate|tree|.......
harvey=speaker|duplicate|something|........


$saveline = $ENV{QUERY_STRING}  # new line input
  open the existing file.
  read each line already there.
  compare 'name' value of $saveline to file records.
  if names match AND value='delete' kill this record.
    }elsif{
    names match AND value!='delete' replace the older record with the new one.
    }else{
    leave the older record as-is.
  }
  write all records back out to the file.
  close file.

So (using data above) if $saveline is:  
buick=old|blue|something|quite|carpet|........
it would append as a new record.

But if $saveline is:
bear=pink|orange|blue|green|red|......
it would overwrite the existing 'bear' line.

Or if $saveline is:
bear=delete|
this record is removed from the file.

Hope I'm making sense here, sorry for the weird thumbnail layout, but I'm in a hurry, I'm at work and have no reference material in front of me.

thanks!
nascar_3Asked:
Who is Participating?
 
ozoConnect With a Mentor Commented:
$oldfile = "oldfilename";
$newfile = "tempfile.$$";
$saveline = $ENV{QUERY_STRING} || "bear=pink|orange|blue|green|red\n";
open O,"<$oldfile" or die "can't read $oldfile because $!";
open N,">$newfile" or die "can't write $newfile because $!";
chomp $saveline;
$saveline .= $/;
($name,$value) = (split/\|/,$saveline)[0,1];
if( $value eq "delete" ){ $saveline = '';
while( <O> ){
    $oldname=(split/\|/)[0];
    if( $oldname eq $name ){
     print N $saveline;
        $saveline = '';
    }else{
     print N;
    }
}
print N $saveline;
close N or die "Can't close $!";
close O;
rename $newfile,$oldfile or die "Can't rename $!";

0
 
ozoCommented:
Does the order of the lines in the file matter?
0
 
nascar_3Author Commented:
No, there is nothing depending on the sort order.
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
ozoCommented:
#sorry, that should have been
($name,$value) = (split/[=|]/,$saveline)[0,1];
0
 
nascar_3Author Commented:
thanks ozo-

I'll play with this later when I'm home, but a couple of questions:

Could you explain a little bit about what these 2 lines are doing?
chomp $saveline;
$saveline .= $/;

Why the []and | in the split function?
I would have thought just (split/=/,$saveline)
($name,$value) = (split/[=|]/,$saveline)[0,1];


0
 
ozoCommented:
chomp $saveline;
$saveline .= $/;
#I wanted to make sure $saveline ended with one input  record separator
split/=/,$saveline would be fine, except that you then have to compare $value eq "delete|\n"
0
 
nascar_3Author Commented:
Thanks ozo!

I pretty much just plugged it in and it worked!
I needed to add : $saveline=~ s/%20/ /g;
because my form was passing the spaces as '%20', but then it performed just as I wanted it to.

Much Appreciated!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.