#!/usr/bin/perl -w use Benchmark; sub map_sprintf { my $ret = shift; $ret = join( '', map { (/^[^\w ]$/) ? sprintf('%%%02x', ord) : $_ } split(/([^\w ])/, $ret) ); } sub map_pack { my $ret = shift; $ret = join( '', map { (/^[^\w ]$/) ? ('%' . unpack('H*', $_)) : $_ } split(/([^\w ])/, $ret) ); } sub sub_sprintf { my $ret = shift; $ret =~ s/([^\w ])/sprintf '%%%02x', ord($1)/ge; $ret; } sub sub_pack { my $ret = shift; $ret =~ s/([^\w ])/'%' . unpack('H*', $1)/ge; $ret; } my $string = "NO, \$WHO, YOU'RE WRONG!!"; print "*** TEST ***\n"; print "map_sprintf: ", &map_sprintf($string), "\n"; print "map_pack : ", &map_pack($string), "\n"; print "sub_sprintf: ", &sub_sprintf($string), "\n"; print "sub_pack : ", &sub_pack($string), "\n"; timethese( 10000, { map_sprintf => sub { &map_sprintf($string) }, map_pack => sub { &map_pack($string) }, sub_sprintf => sub { &sub_sprintf($string) }, sub_pack => sub { &sub_pack($string) }, } );