in reply to Re: Distinguishing a v-string from something else
in thread Distinguishing a v-string from something else

Good point. My context is that of a version number. Adding trailing zeros will not affect the ordering of greater/less, but will affect exact matches using eq (I figured stripping trailing zeros to normalize before comparing for equality).

A function that takes an IP address as a buffer of 4 bytes, a v-string (which will UTF-8-encode the values above 127), or a string can tell the difference by looking for the presence of only digits and dots and of the total length.

—John

  • Comment on Re: Re: Distinguishing a v-string from something else

Replies are listed 'Best First'.
Re^3: Distinguishing a v-string from something else
by particle (Vicar) on Dec 05, 2002 at 14:44 UTC
    a v-string (which will UTF-8-encode the values above 127)

    actually, they're UTF-8 encoded if they're above 255.

    > perl -MDevel::Peek -e"$a=v256;$b=v128;Dump$a;Dump$b" SV = PV(0x182ebf4) at 0x182383c REFCNT = 1 FLAGS = (POK,pPOK,UTF8) PV = 0x182013c "\304\200"\0 CUR = 2 LEN = 3 SV = PV(0x182ec24) at 0x1823848 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x182012c "\200"\0 CUR = 1 LEN = 2

    you can differentiate between a number and a v-string by examining the result of the SvPOKp(SV*) macro. a true return means a v-string, false indicates a number.

    if you can differentiate between a v-string and any other string by your above method, you should be able to determine whether or not you have a v-string, no?

    ~Particle *accelerates*

      Re: actually, they're UTF-8 encoded if they're above 255.

      I just got around to verifying this. Actually, it does not work the same as chr, in that the v-string encoding faithfully follows the utf8 pragma, while chr decides for itself whether to return a byte or char oriented string regardless of the pragma setting.

      I'm wondering, though, if a number without a v and only 1 dot (normally a floating-point numeric constant) is dual-valued magic when parsed as the indirect object of a use or require? Have to peek at what comes into VERSION.

      if you can differentiate between a v-string and any other string by your above method, you should be able to determine whether or not you have a v-string, no?

      I can easily enough decide if I have a v-string or a string of the form "1.2.3.4" as ASCII, provided it has at least one dot in the latter. That's my purpose: to allow either as the value of $VERSION.

      —John

        i really hope you can get this going. the code on your pad looks like a fantastic start.

        i would suggest that if you do find a way to distinguish a v-string from anything else, you submit a patch to Scalar::Util. an isvstring sub would be very handy.

        ~Particle *accelerates*