- 论坛徽章:
- 0
|
楼主,你问的问题和我上周问的是一样的。
有两个知识点:
1) perl语言中标量的多值
2) perl语言中智能匹配的灵活性
具体解释,如下:
case 1
#############################################
my $one = '1.00';
Dump($one);
SV = PV(0x287044) at 0x182afe4
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x1824b8c "1.00"\0
CUR = 4
LEN = 8
这时候变量one是字符串PV中可以看出来
#############################################
$one + 5; #操作符+,是典型的数字运算操作符,它会强制左右变量转化成为整形或者浮点型等数字类型
Dump($one);
SV = PVNV(0x288b5c) at 0x182afe4
REFCNT = 1
FLAGS = (PADMY,IOK,NOK,POK,pIOK,pNOK,pPOK)
IV = 1
NV = 1
PV = 0x1824b8c "1.00"\0
CUR = 4
LEN = 8
你可以看到IV,NV的值是1,PV还是1.00。
变量one已经是多值标量了,并且IOK标签在前,说明会优先使用作为整形数字使用
#############################################
$one ~~ '1'
#智能操作符的特点是根据左右的数据类型再去选择语法的上下文环境。
#左边是多值标量,并且优先作为整形数字使用(即IV);右边是字符型‘1’。
#智能匹配左边或者右边是数字,而另外一边是字符串的时候,等于==
#右边转化成为整型数据1,所以比较是 1 == 1,即TRUE
case 2
#############################################
my $one = '1a';
Dump($one);
SV = PV(0x287044) at 0x182afe4
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x28f8cc "1a"\0
CUR = 2
LEN = 4
这时候one是字符串,从PV当中就可以看到了
#############################################
$one + 5; #操作符+,是典型的数字运算操作符,它会强制左右变量转化成为整形或者浮点型等数字类型
Dump($one);
SV = PVNV(0x288b5c) at 0x182afe4
REFCNT = 1
FLAGS = (PADMY,POK,pIOK,pNOK,pPOK)
IV = 1
NV = 1
PV = 0x28f8cc "1a"\0
CUR = 2
LEN = 4
这个时候变量one就转化成了多值标量,包含PV,IV,NV,并且优先作为字符串使用
#############################################
$one ~~ '1'
#智能操作符的特点是根据左右的数据类型再去选择语法的上下文环境。
#左边是多值标量,并且优先作为字符串使用(即PV);右边是字符型‘1’。
#智能匹配左边或者右边是数字,而另外一边是字符串的时候,等于==。但是若左右都是字符串,这时候相当于 eq
#所以比较是 ‘1a’ == ‘1’,即FALSE
#############################################
注意:我的描述中“优先当作什么使用”是我经过多次运算结果反推得到的,是我个人理解
我刚刚开始深入你学习perl,这方面还需要大家帮忙把把关。
谢谢 |
|