That's 19 characters by my count. Using the internal equivalent of space, plus why pop when you can just fire it in and hope for the best?

Am I correct in assuming the function has to return the string instead of printing it? One character either way.

I also think this only works in Perl 5.6 or better. A test in 5.005_02 fails, printing %*vX In that case, I think a 33 character solution is:

$_=unpack"H*",pop;s/..\B/$& /g;$_

As a note, I would have used @_ in the second one, but under an older version, it would seem that the unpack function is prototyped and this array is rendered to hex 31, which is in fact an ASCII "1". This could save one stroke, for a total of 32.