From: Stuart Clarke Date: 2008-12-22T01:25:52+09:00 Subject: Re: Using ruby hash on array Thanks for your help Todd. I have gone for a different approach which I will post should it work. I was wondering could you explain this code: count.each do |a, cnt| printf "%20s %6d\n", a, cnt end I have no idea what the %20s ...... is doing. Many thanks Todd Benson wrote: > On Thu, Dec 18, 2008 at 1:12 PM, Stuart Clarke > wrote: >> Sorry I was getting to replying to you then got called off in a hurry. I >> do not understand some of the code you have used as I am relatively new >> to Ruby. Can you briefly outline the code, it would be greatly >> appreciated. > >> Robert Klemme wrote earlier: >> A framework: >> >> Data = Struct.new :a, :b:, :c, :d, :e, :f > (leave off the extra : after b :-) > > Struct is an automatic way to define a simple class. There, he's > defining the structure of a class that he wants to call Data with the > use of Struct. So with this statement, we will have a class that has > attributes a, b, c, d, e, f, all with getters and setters, and (at > least in 1.8.7 AFAIK) an initialize method. For example... > > MySimpleClass = Struct.new :instance_var > m = MySimpleClass.new "hi" > puts m.instance_var > m.instance_var = "bye" > puts m.instance_var > #hi > #bye > >> >> def Data.parse(line) >> d = new(*line.strip.split(/\s+/)) >> d.f = Integer(d.f) >> d >> end > > There he is defining a class method called parse on the class Data. > This method returns a Data object filled with the info that was in the > string "line". > >> >> count = Hash.new 0 > > As explained, that was a Hash initialization with a default value of 0 > >> >> ARGF.each do |line| >> data = Data.parse(line) >> count[data.f[/Name:\t(.+?)\r\n/, 1]] += 1 if data.a == 100 >> end > > Rack up the count if the conditions are met > >> >> count.each do |a, cnt| >> printf "%20s %6d\n", a, cnt >> end > > Print the darn thing out! > > hth, > Todd -- Posted via http://www.ruby-forum.com/.