Array addressing problem

I know this is a simple problem - to 'most everyone but me, but I cannot see why I'm getting this error. I've explored things with ruby-debug, and with irb inside of the debugger, and I simply cannot replicate the error.

The code (this most of a little routine for converting an HTML file to a textile marked up file):

  # input
    filein = open( "{whatever}" )
    fi = filein.readlines
  # output
    fileout = open( "_textile.txt", 'w')
  delta = [
    ["</p>", ''],
    ["</h1>", '']] # for brevity, I've truncated this array - you get the idea, I assume
  ld = delta.length
  i = 0 until i > ld
    #results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt isolate error, I broke this into the following:
    s1 = delta[i][0] # <= exception is thrown here
    s2 = delta[i][1]
    results = fi[0].gsub( s1, s2 )
    i += 1
    end

The error msg:

$ ruby textilemkr.rb
textilemkr.rb:55:in `main': undefined method `[]' for nil:NilClass (NoMethodError)
        from textilemkr.rb:66

I've confirmed that delta[1][0] is valid, that "i" is 0 when error occurs, etc.

If it works in irb, why doesn't it work when I run the routine via the interpreter? What obvious thing am I missing?

All help will be gratefully accepted.

Tom

···

--

Hi --

I know this is a simple problem - to 'most everyone but me, but I cannot see why I'm getting this error. I've explored things with ruby-debug, and with irb inside of the debugger, and I simply cannot replicate the error.

The code (this most of a little routine for converting an HTML file to a textile marked up file):

# input
  filein = open( "{whatever}" )
  fi = filein.readlines
# output
  fileout = open( "_textile.txt", 'w')
delta = [
  ["</p>", ''],
  ["</h1>", '']] # for brevity, I've truncated this array - you get the idea, I assume
ld = delta.length
i = 0 until i > ld
  #results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt isolate error, I broke this into the following:
  s1 = delta[i][0] # <= exception is thrown here
  s2 = delta[i][1]
  results = fi[0].gsub( s1, s2 )
  i += 1
  end

The error msg:

$ ruby textilemkr.rb
textilemkr.rb:55:in `main': undefined method `' for nil:NilClass (NoMethodError)
      from textilemkr.rb:66

I've confirmed that delta[1][0] is valid, that "i" is 0 when error occurs, etc.

If it works in irb, why doesn't it work when I run the routine via the interpreter? What obvious thing am I missing?

It doesn't work in irb:

delta = [

?> ["</p>", ''],
?> ["</h1>", '']] # => [["</p>", ""], ["</h1>", ""]]

ld = delta.length

=> 2

i = 0

=> 0

until i > ld
   s1 = delta[i][0] # <= exception is thrown here
   s2 = delta[i][1]
   i += 1
end

NoMethodError: undefined method `' for nil:NilClass

The problem is that the length of the array is 2, but delta[2] is nil.
I'm reasonably sure that that's when it's failing, not when i is 0,
unless the shortened version is missing something that would make that
happen.

I would dispense with i entirely and just iterate over delta.

David

···

On Mon, 16 Jun 2008, Tom Cloyd wrote:

--
Rails training from David A. Black and Ruby Power and Light:
   ADVANCING WITH RAILS June 16-19 Berlin
   ADVANCING WITH RAILS July 21-24 Edison, NJ
See http://www.rubypal.com for details and updates!

David A. Black wrote:

Hi --

I know this is a simple problem - to 'most everyone but me, but I cannot see why I'm getting this error. I've explored things with ruby-debug, and with irb inside of the debugger, and I simply cannot replicate the error.

The code (this most of a little routine for converting an HTML file to a textile marked up file):

# input
  filein = open( "{whatever}" )
  fi = filein.readlines
# output
  fileout = open( "_textile.txt", 'w')
delta = [
  ["</p>", ''],
  ["</h1>", '']] # for brevity, I've truncated this array - you get the idea, I assume
ld = delta.length
i = 0 until i > ld
  #results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt isolate error, I broke this into the following:
  s1 = delta[i][0] # <= exception is thrown here
  s2 = delta[i][1]
  results = fi[0].gsub( s1, s2 )
  i += 1
  end

The error msg:

$ ruby textilemkr.rb
textilemkr.rb:55:in `main': undefined method `' for nil:NilClass (NoMethodError)
      from textilemkr.rb:66

I've confirmed that delta[1][0] is valid, that "i" is 0 when error occurs, etc.

If it works in irb, why doesn't it work when I run the routine via the interpreter? What obvious thing am I missing?

It doesn't work in irb:

delta = [

?> ["</p>", ''],
?> ["</h1>", '']] # => [["</p>", ""], ["</h1>", ""]]

ld = delta.length

=> 2

i = 0

=> 0

until i > ld
   s1 = delta[i][0] # <= exception is thrown here
   s2 = delta[i][1]
   i += 1
end

NoMethodError: undefined method `' for nil:NilClass

The problem is that the length of the array is 2, but delta[2] is nil.
I'm reasonably sure that that's when it's failing, not when i is 0,
unless the shortened version is missing something that would make that
happen.

I would dispense with i entirely and just iterate over delta.

David

Nice. Thanks much, on both points. I never "saw" i get to 2, and so didn't see the error. Jeez. I do find it hard to be a weekend warrior with Ruby. I lose bits between my ears during the workweek!

Thanks again for you help.

t.

···

On Mon, 16 Jun 2008, Tom Cloyd wrote:

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~