From: MonkeeSage Date: 2007-12-07T22:30:02+09:00 Subject: Re: printing on new lines On Dec 7, 6:18 am, Johnathan Smith wrote: > hello > > iv written a class which prints a a number of hashes of refrences > > however it all prints on one line. What i was wondering was it is > possible to print each reference on a different line. > > Any help would be much appreciated > my code is below > > thanks > > $linecount = 0 > > database = {} > > opts.each do |opt, arg| > case opt > when '--style' > require arg > when '--database' > > File.open(arg) { | handle | > last_tag = nil > > handle.each { | line | > > m = line.match(/^(\w+):\s*([\w+,\s]+)$/i) > > if m # if m is a match (i.e., not nil) > > if m[1] == 'Tag' # adds a key to the hash > > last_tag = m[2].chomp > > database[last_tag] = {} # makes a subhash as the value > > else > > database[last_tag][m[1]] = m[2].chomp > > end > > end > > } > > } > > end > end > > print "Number of References: ", database.length, "\n" # prints number > of references > > print "Hash Contents: ", database.inspect, "\n" # prints hash contents > -- > Posted viahttp://www.ruby-forum.com/. Hello Jonathan, For readability and reusability you should extract the database making code out of the when block and into its own method (and $linecount is obsolete now), so... ==== def make_database(filename) database = {} File.open(filename) { | handle | last_tag = nil handle.each { | line | m = line.match(/^(\w+):\s*([\w+,\s]+)$/i) if m # if m is a match (i.e., not nil) if m[1] == 'Tag' # adds a key to the hash last_tag = m[2].chomp database[last_tag] = {} # makes a subhash as the value else database[last_tag][m[1]] = m[2].chomp end end } } return database end database = {} ## where is opts coming from in this code?? opts.each do |opt, arg| case opt when '--style' require arg when '--database' database = make_database(arg) end end ==== Now after #make_database has been called, you can do whatever you like with the database hash, for example (assuming your previous reference.txt), to print out a sorted inventory with metadata: ==== # this makes an array of arrays, and each # subarray is an array of strings, sorted # on the hash keys, which are composed of # each hash entry and its subhash data refs = database.keys.sort.map { | title | subhash = database[title] ["Reference: #{title}", "Type: #{subhash['Type']}", "Author: #{subhash['Author']}"] } # refs now looks like: #[["Reference: ref1", # "Type: Book", # "Author: Little, S R"], # ["Reference: ref2", # "Type: Journal", # "Author: Smith, J"], # ["Reference: ref3", # "Type: Conference Paper", # "Author: Williams, M"]] refs.each_with_index { | ref, i | puts ref # puts automatically prints each # item of an array on a new line # print a newline in between refs unless # its the last one puts if i < refs.length-1 } ==== This outputs: Reference: ref1 Type: Book Author: Little, S R Reference: ref2 Type: Journal Author: Smith, J Reference: ref3 Type: Conference Paper Author: Williams, M Look at the Hash and Array classes to see exactly what these methods are doing: http://www.ruby-doc.org/core/classes/Hash.html http://www.ruby-doc.org/core/classes/Array.html Regards, Jordan