2010-06-06 3 views
1

J'extrais des informations d'un fichier XML et je souhaite effectuer des modifications sur les données tout en conservant une copie de l'original dans une variable "origFile". C'est ce que j'ai:gsub! Modification de chaînes non spécifiées

require "rexml/document" 
include REXML 

doc = Document.new File.new(thePath) 
root = doc.root 
array = [] 
root.elements.each("dict/string") {|element| array << element} 

origFile = [] 
root.elements.each("dict"){|i| origFile << i} 

theBody = array[6][0].to_s 

theBody.gsub!(/\&lt;!-- more --\&gt;/, "----------Read More----------") 

Le problème est qu'après avoir exécuté gsub! sur theBody, origFile a aussi la modification. Je ne comprends pas pourquoi ce serait ou comment le réparer. J'apprécierais vraiment votre aide.

Répondre

2

Juste ceci:

theBody = array[6][0].to_s.dup 

Sans .dup, vos deux variables sont référant à la même chaîne. Avec lui, The Body obtient une copie distincte.

+0

Wow, c'est génial! Merci beaucoup! – MWean

1

Vous modifiez la chaîne en place, ce qui signifie que vous modifiez également toute autre référence à cette chaîne. Si vous ne voulez theBody être modifié, utilisez dup pour copier la chaîne et de créer une nouvelle instance de celui-ci:

theBody = array[6][0].to_s.dup 
theBody.gsub!(/\&lt;!-- more --\&gt;/, "----------Read More----------") 

Vous pouvez aussi utiliser gsub (sans !):

theBody = array[6][0].to_s 
theBody = theBody.gsub(/\&lt;!-- more --\&gt;/, "----------Read More----------") 

I recommanderais ceci:

theBody = array[6][0].to_s. 
    gsub(/\&lt;!-- more --\&gt;/, "----------Read More----------") 
Questions connexes