Каждое число, разделенное точкой, преобразуется в символ с порядковым значением числа. [1] Другими словами,
v1.0 ≡ "\x01\x00" ≡ chr(1).chr(0) ≡ pack('W*', 1, 0)
Вы можете преобразовать v-строкув нечто читаемое человеком, используя спецификатор формата %vd
sprintf
. [2]
$ perl -e'CORE::say sprintf("%vd", v1.0)'
1.0
Но лучше использовать модуль version .
$ perl -Mversion -e'CORE::say version->parse(v1.0)'
v1.0
Это лучше, потому что модуль версии может обрабатывать строки версии в целом (не только v-строки).
$ perl -Mversion -e'
my $v1 = version->parse(1.0);
my $v2 = version->parse("1.0");
my $v3 = version->parse(v1.0);
my $v4 = version->parse("v1.0");
CORE::say "equal"
if $v1 == $v2
&& $v1 == $v3
&& $v1 == $v4
'
equal
Можно использовать любой оператор сравнения чисел или строк [3] для сравнения объектов версий.
Хотя это больше, чем это.К скаляру, содержащему v-строку, применена магия (типа V
), поэтому можно определить, что это v-строка.
$ perl -MDevel::Peek -e'Dump("\x01\x00"); Dump(v1.0);'
SV = PV(0xbc9d70) at 0xbe7998
REFCNT = 1
FLAGS = (POK,IsCOW,READONLY,PROTECT,pPOK)
PV = 0xbf1ed0 "\1\0"\0
CUR = 2
LEN = 10
COW_REFCNT = 0
SV = PVMG(0xc20480) at 0xbe7938
REFCNT = 1
FLAGS = (RMG,POK,IsCOW,READONLY,PROTECT,pPOK)
IV = 0
NV = 0
PV = 0xbf0190 "\1\0"\0
CUR = 2
LEN = 10
COW_REFCNT = 0
MAGIC = 0xbf3a80
MG_VIRTUAL = 0
MG_TYPE = PERL_MAGIC_vstring(V)
MG_LEN = 4
MG_PTR = 0xbf1700 "v1.0"
Эта магия применяется даже к любому скаляру, к которому относитсяv-строка копируется!
$ perl -MDevel::Peek -e'my $v1 = v1.0; my $v2 = $v1; Dump($v2)'
SV = PVMG(0x9dc500) at 0x9a3a00
REFCNT = 1
FLAGS = (RMG,POK,IsCOW,pPOK)
IV = 0
NV = 0
PV = 0x9ac1b0 "\1\0"\0
CUR = 2
LEN = 10
COW_REFCNT = 2
MAGIC = 0x9b8090
MG_VIRTUAL = 0
MG_TYPE = PERL_MAGIC_vstring(V)
MG_LEN = 4
MG_PTR = 0x9adef0 "v1.0"
Я полагаю, что модуль версии использует эту информацию.
Этот спецификатор формата работает с любой строкой, поэтому его удобнопроверка скрытых или специальных символов при отладке.
$ perl -e'CORE::say sprintf "%v02X", "abc\r\n"'
61.62.63.0D.0A
==
, <
, >
, <=
, >=
, <=>
, eq
, lt
, gt
, le
, ge
и cmp
.