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:

$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.
    names match AND value!='delete' replace the older record with the new one.
    leave the older record as-is.
  write all records back out to the file.
  close file.

So (using data above) if $saveline is:  
it would append as a new record.

But if $saveline is:
it would overwrite the existing 'bear' line.

Or if $saveline is:
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.

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> ){
    if( $oldname eq $name ){
     print N $saveline;
        $saveline = '';
     print N;
print N $saveline;
close N or die "Can't close $!";
close O;
rename $newfile,$oldfile or die "Can't rename $!";

Does the order of the lines in the file matter?
nascar_3Author Commented:
No, there is nothing depending on the sort order.
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.

#sorry, that should have been
($name,$value) = (split/[=|]/,$saveline)[0,1];
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];

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"
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!
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.