Tim,

> Although I think I understand what's going on here,
> it leaves me wondering what would be a better way
> to do what I need to do, if there is a better way.
>
> The input file contains three tab-separated fields.
> The second field needs to be able to contain an
> arbitrary number of newlines (which will be
> realized as actual newlines, so to speak, when this
> field is later printed out).

    The basic problem here is that you have a two-level data structure that
you want to represent.  The first level is three fields separated by the
string "\t", and the second level is zero or more sub-fields separated by
'\n' in the second field.  Your decision to use '\n' as a separator led you
to a small confusion when you tried to display the second field.  As others
have pointed out, this can be achieved by simply replacing the two-character
string '\n' with the single character string "\n" (note the difference in
quotes).  Also note that the string '\n' is really just a sub-field
delimiter, and could actually be any string (or character) other than your
field separator ("\t") that is guaranteed not to be part of a sub-field.

    I would think that it would be useful for you to have this two-level
data structure represented in your code.  For instance:

irb(main):001:0> line = "field 1\tfield 2.1\\nfield 2.2\\nfield 2.3\tfield
3"
=> "field 1\tfield 2.1\\nfield 2.2\\nfield 2.3\tfield 3"

irb(main):002:0> fields = line.split(/\t/)
=> ["field 1", "field 2.1\\nfield 2.2\\nfield 2.3", "field 3"]

irb(main):003:0> fields[1] = fields[1].split(/\\n/)
=> ["field 2.1", "field 2.2", "field 2.3"]

irb(main):004:0> fields
=> ["field 1", ["field 2.1", "field 2.2", "field 2.3"], "field 3"]

    You now have access to the sub-fields (e.g. fields[1].length,
fields[1][0], etc.) and can easily join them back together for display:

irb(main):005:0> puts fields[1].join("\n")
field 2.1
field 2.2
field 2.3
=> nil

    Hope this helps!

    - Warren Brown