On 17.09.2011 00:03, Kassym D. wrote:
I have an array of strings that I need to modify. I either need to
replace the string or delete the entry altogether.
irb(main):010:0> a = 10.times.to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
irb(main):011:0> a.map! {|i| i.odd? ? i : nil}.compact!
=> [1, 3, 5, 7, 9]
irb(main):012:0> a
=> [1, 3, 5, 7, 9]
The only way I have
been able to do this is :
arr.delete("")
(0…arr.size).each do |i|
arr.each_index do |i|
if arr[i].to_i == 1201
arr[i]=arr[i].to_s[8…-1].gsub(/"[^"]"/,’::’).gsub(/"./,"::")
Maybe:
arr[i] = arr[i].to_s[8…-1].gsub(/"[^"]*(?:"|\z)/,’::’)
Is this really what you want? First you convert all quoted sequences to
“::” and then you remove everything after the single remaining quote to
the end by “::”?
else
arr[i-1] = arr[i-1] + arr[i].to_s[4…-1].to_s.gsub(/\s*/,"")
arr[i-1] << arr[i].to_s[4…-1].to_s.gsub(/\s*/,"")
arr[i]=nil
end
end
arr.delete(nil)
arr.compact!
Is there a better way ?
First we should clarify what you are doing. As far as I can see you
want to iterate the array and either modify element i or convert element
i and append it to element i - 1. From this it is clear that you cannot
use #map or #map! because those methods are intended to modify the
current object.
Also inside the else I get char 4->-1 of a string, but then need to
explicitly change it into a string for gsub to work. Otherwise it gives
me an undefined method ‘gsub’ for nilNilClass error.
So your statement that you have a String is not correct. You are
probably experiencing this effect
irb(main):017:0> s=“123”
=> “123”
irb(main):018:0> s[4…-1]
=> nil
A bit of sample data would be helpful…
Kind regards
robert