Riposto il codice cosi' gli date una controllatina:

codice:
%lista_txt = &read_lista_txt();
delete $lista_txt{$id};
&write_lista_txt(\%lista_txt);

sub read_lista_txt {

  my ($news_id,$news_title,$news_status,$riga);
  my %lista_txt;

  open(LEGGI,"<lista.txt") || die "Error: (read_lista_txt) lista.txt\n$!";
   flock(LEGGI,1);
    while(<LEGGI>)
    {
     ($news_id,$news_title,$news_status) = split(/\|/, $_);
     $lista_txt{$news_id} = [ $news_title,$news_status ];
    }
   flock(LEGGI,8);
  close(LEGGI);
  
  return %lista_txt;

}

sub write_lista_txt {

  my $lista_txt = shift; 
  my $riga;

  open(SCRIVI,"+< lista.txt") || die "Error: (write_lista_txt) lista.txt\n$!";
   flock(SCRIVI,2);
    seek(SCRIVI,0,0); truncate(SCRIVI,0);
     foreach (sort (keys $%lista_txt) )
     {
      $riga = $_ . '|' . $lista_txt{$_}[0] . '|' . $lista_txt{$_}[1] . '|';
      print SCRIVI "$riga\n";
     }
   flock(SCRIVI,8);
  close(SCRIVI);

}