Forum: Ruby problem with .each do

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
michelle (Guest)
on 2005-11-20 12:23
(Received via mailing list)
Hiya.  The book does things this way, so why doesn't it work for me?
What's going on?

def fromWeb(site, url)
	# get data from website
	h = Net::HTTP.new(site, 80)
	resp, data=h.get(url, nil)

	# process data
	data.each do <- point of second error
		|line|
		if /DGM_navigation/ =~ line do
			# decode page lineage
			step=Array.new
			astep, line = getNextWord(line)
			while astep != nil
				step.push(astep)
				astep, line = getNextWord(line)
			end
			puts "Page Lineage"
			step.each do
				|astep|
				step.each do
					put " "
				end
				puts astep
			end
		end # end DGM_naviation
	end # end data.each <- gets "undefined method 'line'", from the second
error point above
end # end def fromWeb

def getNextWord(line)
	i1 = />\w+</ =~ line

	string_wanted=$&[1..$&.length-1]
	string_remaining=$'
	return string_wanted, string_remaining
end
ljz (Guest)
on 2005-11-20 12:47
(Received via mailing list)
Lady Michelle B. <removed_email_address@domain.invalid> writes:

> 		|line|
>               [ ... etc. ... ]
> 	end # end data.each <- gets "undefined method 'line'", from the second

It turns out that Net::Http#get no longer returns a pair of values.  It
has changed between ruby version 1.6 (from the edition of the book that
you probably have) and 1.8.  This is explained in the method's latest
documentation (from
http://www.ruby-doc.org/stdlib/libdoc/net/http/rdo...

  get(path, initheader = nil, dest = nil) {|+body_segment+| ...}

  Gets data from path on the connected-to host. header must be a Hash
  like { 'Accept' => '*/*', ... }.

  In version 1.1 (ruby 1.6), this method returns a pair of objects, a
  Net::HTTPResponse object and the entity body string. In version 1.2
  (ruby 1.8), this method returns a Net::HTTPResponse object.

  If called with a block, yields each fragment of the entity body in
  turn as a string as it is read from the socket. Note that in this
  case, the returned response object will not contain a (meaningful)
  body.

  dest argument is obsolete. It still works but you must not use it.

  In version 1.1, this method might raise an exception for 3xx
  (redirect). In this case you can get a HTTPResponse object by
  "anException.response".

  In version 1.2, this method never raises exception.

    # version 1.1 (bundled with Ruby 1.6)
    response, body = http.get('/index.html')

    # version 1.2 (bundled with Ruby 1.8 or later)
    response = http.get('/index.html')

    # using block
    File.open('result.txt', 'w') {|f|
      http.get('/~foo/') do |str|
        f.write str
      end
    }

See also Net::HTTPResponse within that same documentation.
Daniel S. (Guest)
on 2005-11-20 12:51
(Received via mailing list)
Lady Michelle B. wrote:
>         |line|
Try `data.each do |line|'. It may be the line break that's causing
trouble.

>                 |astep|
Same here.

> def getNextWord(line)
>     i1 = />\w+</ =~ line
>
>     string_wanted=$&[1..$&.length-1]
>     string_remaining=$'
>     return string_wanted, string_remaining
> end
>
>


Cheers,
Daniel
Daniel S. (Guest)
on 2005-11-20 13:43
(Received via mailing list)
Sorry, it actually seems to work even with the line break. My bad.


Cheers,
Daniel
This topic is locked and can not be replied to.