# Syntax error, unexpected '}', expecting kEND

**URL:** <https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134>\
**Category:** Ruby\
**Created:** [August 11, 2010, 11:37pm UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134 "2010-08-11T23:37:33Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![rainyglade](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/cab0a1/32.png) [@rainyglade](https://www.ruby-forum.com/u/rainyglade)\
**Post date:** [August 11, 2010, 11:37pm UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134/1 "2010-08-11T23:37:33Z")

</div>

I’m using ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32], WinXP  
and Notepad++ in the Unix mode (for line endings)

I have the following code:

q = [1.0, 4.0, 10.0, 27.0, 50.0, 600.0, 1000.0, 5833.0, 6250.0,  
1500000.0]  
x = q.each{|e| print Math.log10(e).to\_i, " "}  
p x  
r = q.collect{|e| Math.log10(e).to\_i}  
p r  
q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i]  
+=1 }

i=0  
q.inject(Array.new(4,0)) do |h,e|  
if e \< 10000 then h[r[i]] += 1  
i += 1  
end

The first 5 lines work as expected. However, the first q.inject line  
and the q.inject block give the following errors:

D:\abc\>ruby doh2.rb  
doh2.rb:6: syntax error, unexpected ‘}’, expecting kEND  
doh2.rb:12: syntax error, unexpected $end, expecting kEND

My goal is to take the numbers in q and count how many are in the ranges  
1-9, 10-99, 100-999 and 1000-9999.

I thought maybe it was using the Math.log10 expression as an array  
index, hence the second q.inject code.

I have looked at an octal dump. No surprises there.

0000000 q = [ 1 . 0 , 4 . 0 , 1  
0000020 0 . 0 , 2 7 . 0 , 5 0 . 0 ,  
0000040 6 0 0 . 0 , 1 0 0 0 . 0 ,  
0000060 5 8 3 3 . 0 , 6 2 5 0 . 0 ,  
0000100 1 5 0 0 0 0 0 . 0 ] \n x = q  
0000120 . e a c h { | e | p r i n t  
0000140 M a t h . l o g 1 0 ( e ) . t o  
0000160 \_ i , " " } \n p x \n r =  
0000200 q . c o l l e c t { | e | M  
0000220 a t h . l o g 1 0 ( e ) . t o \_  
0000240 i } \n p r \n q . i n j e c t (  
0000260 A r r a y . n e w ( 4 , 0 ) ) {  
0000300 | h , e | i f e \< 1 0  
0000320 0 0 0 t h e n h [ M a t h .  
0000340 l o g 1 0 ( e ) . t o \_ i ] +  
0000360 = 1 } \n \n i = 0 \n q . i n j e  
0000400 c t ( A r r a y . n e w ( 4 , 0  
0000420 ) ) d o | h , e | \n \t i f  
0000440 e \< 1 0 0 0 0 t h e n h  
0000460 [r [ i] ] + = 1 \n \t i +  
0000500 = 1 \n e n d \n  
0000510

Any ideas as to what is going on here? I have also tried other inject  
statements that I know used to work, but they don’t now. Is inject  
broken in my version?

Thanks,  
Louise

---

<div class="post-metadata">

**Author:** ![rainyglade](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/cab0a1/32.png) [@rainyglade](https://www.ruby-forum.com/u/rainyglade)\
**Post date:** [August 11, 2010, 11:53pm UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134/2 "2010-08-11T23:53:09Z")

</div>

> q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i]  
> +=1 }

“if” needs a matching “end”, unless you use the postfix form:

h[…] += 1 if e \< 10000

BTW, even if you’re using ruby 1.8.7, running ruby 1.9.x on your code  
with the -w flag can sometimes give better error messages.

---

<div class="post-metadata">

**Author:** ![rainyglade](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/cab0a1/32.png) [@rainyglade](https://www.ruby-forum.com/u/rainyglade)\
**Post date:** [August 12, 2010, 12:20am UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134/3 "2010-08-12T00:20:24Z")

</div>

Hi –

On Thu, 12 Aug 2010, Louise R. wrote:

> q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i] +=1 }

There’s no ‘end’ on that ‘if’.

David

–  
David A. Black, Senior Developer, Cyrus Innovation Inc.

The Ruby training with Black/Brown/McAnally  
Compleat Philadelphia, PA, October 1-2, 2010  
Rubyist [http://www.compleatrubyist.com](http://www.compleatrubyist.com)

---

<div class="post-metadata">

**Author:** ![rainyglade](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/cab0a1/32.png) [@rainyglade](https://www.ruby-forum.com/u/rainyglade)\
**Post date:** [August 12, 2010, 12:23am UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134/4 "2010-08-12T00:23:07Z")

</div>

Brian C. wrote:

> > q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i]  
> > +=1 }
> 
> “if” needs a matching “end”, unless you use the postfix form:
> 
> h[…] += 1 if e \< 10000
> 
> BTW, even if you’re using ruby 1.8.7, running ruby 1.9.x on your code  
> with the -w flag can sometimes give better error messages.

Thanks, that is just the ticket!

---

<div class="post-metadata">

**Author:** ![rainyglade](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/cab0a1/32.png) [@rainyglade](https://www.ruby-forum.com/u/rainyglade)\
**Post date:** [August 12, 2010, 12:22am UTC](https://www.ruby-forum.com/t/syntax-error-unexpected-expecting-kend/193134/5 "2010-08-12T00:22:09Z")

</div>

Louise R. wrote:

> q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i]  
> +=1 }

You need an “end” to go with the "if … then … " :

q.inject(Array.new(4,0)){ |h,e| if e \< 10000 then h[Math.log10(e).to\_i]  
+=1; end }
