>1 while ($str =~ s/(\x1B\$[\45-\x47\x4F-\x51])([\x21-\x7A])([\x21-\x7A]+)(\x0F)/$1$2$4$1$3$4/g);
>$str =~ s/\x1B\$([\45-\x47\x4F-\x51][\x21-\x7A])\x0F/'<img src="' . $JskyEmojiDir . unpack('n',$1) . '.gif" border=0 width=12 height=12>'/eg;
>$str =~ s/\x0F$//; }

とりあえず、whileの中の置換gオプションは間違いじゃかと。
あと1、2行目の文字クラスで\45もおかしいよね。。。