Eric Wilhelm wrote: > I'm very troubled by any inclusion of underscores in the META.yml spec > because they behave differently between perl v-strings and version.pm. > > Example: v1.0.2_3 gt v1.0.3, but qv(v1.0.2_3) < v1.0.3
You aren't using version.pm comparisons in both cases, so it shouldn't be all that surprising that it doesn't work the way you'd expect it. Look here: $ perl -Mversion -MDevel::Peek -e 'Dump(v1.0.2_3)' SV = PVMG(0x830658c) at 0x82a8984 REFCNT = 1 FLAGS = (PADTMP,RMG,POK,READONLY,pPOK) IV = 0 NV = 0 PV = 0x82cacac "\1\0\27"\0 CUR = 3 LEN = 8 MAGIC = 0x82caf24 MG_VIRTUAL = 0 MG_TYPE = PERL_MAGIC_vstring(V) MG_LEN = 8 MG_PTR = 0x82cc464 "v1.0.2_3" When constructing the PV, the underscore is ignored (as in any bare number), but the PERL_MAGIC_vstring(V) has the original text as written. If you do this instead: $ perl -Mversion -e 'print (v1.0.2_3 < version->new(v1.0.3))' 1 you'll see that correct version object comparisons work as designed. If your code is comparing versions with version.pm, liberally sprinkle version->new() on at least one of your terms and you will always be safe. Don't use qv() because it is _not_ a generic version object creator; it forces extended version notation, even where it would otherwise parse as numeric: > ยท qv() > An alternate way to create a new version object is through the > exported qv() sub. This is not strictly like other q? operators > (like qq, qw), in that the only delimiters supported are parenthe- > ses (or spaces). It is the best way to initialize a short version > without triggering the floating point interpretation. For example: > > $v1 = qv(1.2); # 1.2.0 > $v2 = qv("1.2"); # also 1.2.0 > > As you can see, either a bare number or a quoted string can usually > be used interchangably, except in the case of a trailing zero, > which must be quoted to be converted properly. For this reason, it > is strongly recommended that all initializers to qv() be quoted > strings instead of bare numbers. This was one of my big failings when writing version.pm; I originally intended this to be useful to CVS users (where $Revision$ is a sequence of integers separated by one or more decimal points). However, a lot of people assumed because it was 'qv' (quoted version) that must mean it was a generic version creation operator. John