I need to parse a string char by char, if the char is a number it should
go
to a array without any modification, however in case of letters they
should
be decoded into hexadecimals before they go to the array, for example if
I
have:
text = “hello5” the array should be
=> [“68”, “65”, “6c”, “6c”, “6f”, “5”]
So only letters should be converted.
I wrote the following code but don’t know what the problem with it:
text = “hello5”
number = /\d/
ntext = []
i = 0
while i < text.length
if text[i].chr=~ number
ntext << text[i].chr
else
ntext << text[i].chr.unpack(‘U’)[i].to_s(16)
end
end
It seems to work for the first value only text[0], when replaced with
text[1] or anything else I get:
“in `to_s’: wrong number of arguments (1 for 0) (ArgumentError)”
So the array ntext only stores the first converted letter, I couldn’t
spot
the problem?!!
what is the meaning of “%x” and also ’ “%x” % ’
Sorry I am so noob.
It’s a way of generating strings, using interpolated arguments. The
target string has %-based format characters, like you’d use with
sprintf. You need to provide one argument for each element in the
format string.
So to print a string and a decimal, you’d do:
puts “%d is %s” % [10, “ten”] # 10 is ten
%x does a hex conversion:
puts “%x in hex is %s”, [10, “sixteen”] # a in hex is sixteen
David
–
Upcoming Rails training from David A. Black and Ruby Power and Light:
ADVANCING WITH RAILS, April 14-17 2008, New York City
CORE RAILS, June 24-27 2008, London (Skills Matter)
See http://www.rubypal.com for details. Berlin dates coming soon!
while i < text.length
if text[i].chr=~ number
ntext << text[i].chr
else
ntext << text[i].chr.unpack(‘U’)[i].to_s(16)
end
end
One problem with it is that you don’t increment i The other
problem is that you’ve got unpack(‘U’)[i] but you mean [0].
Keep in mind, though, that you almost never have to maintain a counter
explicitly in Ruby, since the language gives you lots of ways to
operate on collections. For example:
ntext = text.split(//).map {|char|
case char
when /\d/
char
else
“%x” % char.unpack(‘U’)
end
}
David
–
Upcoming Rails training from David A. Black and Ruby Power and Light:
ADVANCING WITH RAILS, April 14-17 2008, New York City
CORE RAILS, June 24-27 2008, London (Skills Matter)
See http://www.rubypal.com for details. Berlin dates coming soon!