Leo_Yao has asked for the wisdom of the Perl Monks concerning the following question:

I try to use utf8::upgrade to upgrade a variable, but when I use print to see what happened to the variable, I found nothing was changed.

$s=chr(192); printf "%vd\n", $s; utf8::upgrade($s); printf "%vd\n", $s;

But if I use "use bytes", the value of $s is changed. Why is it?

use bytes; $s=chr(192); printf "%vd\n", $s; utf8::upgrade($s); printf "%vd\n", $s;

Replies are listed 'Best First'.
Re: Does the utf8::upgrade change the value?
by Anonymous Monk on Feb 25, 2011 at 12:21 UTC
    Because that is how utf8::upgrade works, if there is nothing to change, it doesn't change anything

      Thanks. But I still don't understand why the value is changed in the case of "use bytes".

        character semantics
        $ perl -MDevel::Peek -e "Dump $f=chr(400) " SV = PV(0x3e69ec) at 0x98a414 REFCNT = 1 FLAGS = (POK,pPOK,UTF8) PV = 0x98419c "\306\220"\0 [UTF8 "\x{190}"] CUR = 2 LEN = 4
        byte semantics
        $ perl -MDevel::Peek -e " use bytes; Dump $f=chr(400) " SV = PV(0x3e69f4) at 0x98a434 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x9841ac "\220"\0 CUR = 1 LEN = 4
        utf8::upgrade makes character semantics again
        $ perl -MDevel::Peek -e " use bytes; $f=chr(400); utf8::upgrade($f); +Dump $f " SV = PV(0x3e6a0c) at 0x98a474 REFCNT = 1 FLAGS = (POK,pPOK,UTF8) PV = 0x3ef4e4 "\302\220"\0 [UTF8 "\x{90}"] CUR = 2 LEN = 3
        bytes