2009/2/23 Iki Baz Castillo <ibc / aliax.net>:
> 2009/2/23 Robert Klemme <shortcutter / googlemail.com>:
>> 2009/2/23 Iki Baz Castillo <ibc / aliax.net>:
>>> Hi, I've a module with two methods (thanks Jeff):
>>> - hex_unescape(string)
>>> - hex_scape(string)
>>> as follows:
>>>
>>>  def self::hex_unescape(str)
>>>    str.gsub(/%([0-9a-fA-F]{2})/) { $1.to_i(16).chr }
>>>  end
>>>
>>>  def self::hex_escape(str)
>>>    str.gsub(/[^a-zA-Z0-9_\-.]/n) { sprintf("%%%02X", $&.unpack("C")[0])>>  end
>>>
>>> "hex_escape" method is copied from CGI lib, and sincerelly I don't likeoo
>>> much its approach using "sprintf". Is there other way more ellegant?
>>> (performance is the mos important requeriment anyway).
>>
>> Then I am sure you _measured_ it and came to the conclusion that it is
>> too slow, did you?  What are your results and what are your
>> performance requirements?
>
> I did a Benchmark.realtime comparing hex_unescape and hex_escape
> methods. hex_unescape takes ~2.5*10^(-5) while hex_escape takes
> ~4*10^(-5).
>
> Anyway I've realized right now that "sprintf" is directly implemented
> as C code so it can't be faster.

Well, you can at least do this in 1.8

def self::hex_escape(str)
   str.gsub(/[^a-zA-Z0-9_\-.]/n) {|m| sprintf("%%%02X", m[0]) }
end

And this in 1.9

def self::hex_escape(str)
   str.gsub(/[^a-zA-Z0-9_\-.]/n) {|m| sprintf("%%%02X", m.getbyte(0)) }
end

Cheers

robert

-- 
remember.guy do |as, often| as.you_can - without end