加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl什么时候强加字符串上下文?

发布时间:2020-12-15 23:20:41 所属栏目:大数据 来源:网络整理
导读:看起来字符串上下文(虽然是真实的,并且在“编程Perl”章节“2.7.1.标量和列表上下文”中作为标量上下文的子概念提到),但在我能够找到的任何地方都没有清楚地记录在Perldoc. 显然,Perl中的一些东西(例如eq运算符,或qq //引用插值)会将值强制转换为字符串上下
看起来字符串上下文(虽然是真实的,并且在“编程Perl”章节“2.7.1.标量和列表上下文”中作为标量上下文的子概念提到),但在我能够找到的任何地方都没有清楚地记录在Perldoc.

显然,Perl中的一些东西(例如eq运算符,或qq //引用插值)会将值强制转换为字符串上下文.

Perl什么时候强加字符串上下文?

perldoc似乎是to contain no useful answer.

解决方法

当Perl需要一个字符串时,Perl将生成包含标量的结构的PV(字符串组件).了解这一点的最佳位置是在 perlguts,perldata,在较小的程度上,perlop.但基本上任何时候使用标量执行字符串类型操作,它将强加你的字符串上下文感,如果标量只包含例如,一个整数,将从该值隐式创建一个字符串.

所以,如果你有$var = 15,它在$var中放置一个整数,然后说if($var eq’15’){…},将生成整数15的字符串表示并存储在标量结构的PV部分.

这绝不是一个完整的列表,但以下内容将起到作用:

>字符串比较运算符(eq,ne,ge,le,lt,gt)
>匹配左操作数的绑定运算符(=?,!?)
>字符串插值(qq {$var},“$var”,qx / $var /和反引号)
>正则表达式运算符(m / $插值/,s / $插值//,qr / $插值/)
><<“HERE”(HERE doc with interpolation)
>哈希键$hash {$stringified_key}.
>.连接运算符.
>在较新版本的Perl中,启用了按位功能,字符串按位运算符&.,|.,^.和?.以及它们的赋值对应项(如&.=)将在其操作数上调用字符串上下文.
> vec在其第一个参数上强加了字符串上下文.

可能还有其他人.但好消息是,这个实现细节很少泄漏到“胆量”级别之外的抽象层.可以关注的一个例子是编码JSON,因为我熟悉的JSON模块都会查看给定标量是否有PV组件来决定是将值编码为字符串还是数字.

正如Joel在下面的评论中所指出的那样,自Perl 5.6.0版以来一直在Perl核心中的Devel :: Peek模块可以简化对标量内容的反省:

use Devel::Peek;                    

my $foo = 12;                       

print "Initial state of $foo:n";  
Dump($foo);                         

my $bar = "$foo";                   

print "nnFinal state of $foo:n";
Dump($foo);

该代码生成的输出是:

Initial state of $foo:
SV = IV(0x56547b4bb2a0) at 0x56547b4bb2b0
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 12


Final state of $foo:
SV = PVIV(0x56547b4b5880) at 0x56547b4bb2b0
  REFCNT = 1
  FLAGS = (IOK,POK,pIOK,pPOK)
  IV = 12
  PV = 0x56547b4ab600 "12"
  CUR = 2
  LEN = 10

如您所见,在强制字符串化之后存在PV元素,设置POK标志,并且存在CUR和LEN字段以指示字符串缓冲区的长度和其内容的当前长度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读