- 论坛徽章:
- 0
|
多谢,刚刚注意到了,呵呵。
引入了我的另外两个新问题
1)如何判断智能匹配语法上下文 是数字上下文还是字符串上下文呢?
我个人觉得最容易理解case 3
####################
my $var = "12a" + 0; #var是数字变量12
if ( $var ~~ '12.0' ) { #这个时候智能匹配选择数字上下文 12 == 12.0,转换‘12.0’到数字12
case 1
####################
my $var = "12"; #var是字符串变量
$var + 0; #var转换中字符串成了数字12, var有了两种属性(我简称它为属性),数字12和字符串‘12’
if ( $var ~~ '12.0' ) { #这个时候智能匹配选择数字上下文 12 == 12,??奇怪了为什么选择数字上下文而不是字符串上下文 ‘12’ eq ‘12.0’呢??
case 2
####################
my $var = "12a"; #var是字符串变量
$var + 0; #var转换中字符串成了数字12,var有了两种属性,数字12和字符串‘12a’
if ( $var ~~ '12.0' ) { #这个时候智能匹配选择字符串上下文 ‘12a’ eq ‘12.0’, ??奇怪为什么不选择数字上下文了呢??
2)另外我还有一个困惑的问题就是版主提出的dualvar,这个变量到底存储的是数字变量还是字符串变量,还是都存储然后根据上下文情景再去选择?
我写了一个测试代码如下:
#######################
use Devel: eek qw(Dump);
use Scalar::Util qw(dualvar);
use strict;
my $var1 = 34;
my $var2 = "dbc";
my $var3 = dualvar 34,'dbc';
my $var4 = "34dbc";
Dump($var1);
Dump($var2);
Dump($var3);
$var4 + 0;
Dump($var4);
#######################
结果为
SV = IV(0x182afd0) at 0x182afd4
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 34 <=== 100%数字变量
SV = PV(0x287044) at 0x182b084
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x28f8cc "dbc"\0 <====100%字符串变量
CUR = 3
LEN = 4
SV = PVNV(0x288a6c) at 0x182b004
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 34 ??50%数字变量??
NV = 0
PV = 0x186b05c "dbc"\0 ??50%字符串变量??
CUR = 3
LEN = 4
Argument "34dbc" isn't numeric in addition (+) at test.pl line 12.
SV = PVNV(0x288a54) at 0x182b034
REFCNT = 1
FLAGS = (PADMY,POK,pIOK,pNOK,pPOK)
IV = 34
NV = 34 <===这里和变量三又不太一样
PV = 0x1824b8c "34dbc"\0
CUR = 5
LEN = 8
######################
注意到其中的PV,IV,NV字段有些不同,可以帮我理解吗?谢谢 |
|