Perl打印功能的副作用
发布时间:2020-12-15 23:22:28 所属栏目:大数据 来源:网络整理
导读:我想知道为什么/如何在Perl中打印可能会产生副作用. use Scalar::Util qw/looks_like_number/; my @A = (5,'2','aaa',1,'aab'); my @a = map { looks_like_number($_) } @A; print "1) @an";# prints "4352 1 0 4352 0"print "A print with a side-effect:
我想知道为什么/如何在Perl中打印可能会产生副作用.
use Scalar::Util qw/looks_like_number/; my @A = (5,'2','aaa',1,'aab'); my @a = map { looks_like_number($_) } @A; print "1) @an"; # prints "4352 1 0 4352 0" print "A print with a side-effect: @An"; @a = map { looks_like_number($_) } @A; print "2) @an"; # prints "1 1 0 1 0" 在此示例中,Looks_like_number在打印之前返回4352 1 0 4352 0,在打印之后返回1 1 0 1 0 0. print对这些值做了什么来影响它们被Looks_like_number解释的方式? 解决方法
在插入或以其他方式连接数值时,需要创建字符串化版本.此字符串存储在标量中(除了数值之外)供以后使用,这可能会影响look_like_number返回的值.
要检查变量的内部,请使用Devel::Peek [1]. use Devel::Peek qw( Dump ); my @A = (5,'aaa'); Dump($_) for @A; # Or: Dump(@A); print "@An"; Dump($_) for @A; 使用Perl 5.20,您将获得以下内容:(为了便于阅读而重新排列) Before After =============================== =============================== SV = IV(0x4532a78) at 0x4532a88 SV = PVIV(0x45563a0) at 0x4532a88 REFCNT = 2 REFCNT = 2 FLAGS = (IOK,pIOK) FLAGS = (IOK,POK,pIOK,pPOK) IV = 5 IV = 5 PV = 0x454a870 "5" CUR = 1 LEN = 10 SV = PV(0x45336a0) at 0x4532c08 SV = PV(0x45336a0) at 0x4532c08 REFCNT = 2 REFCNT = 2 FLAGS = (POK,IsCOW,pPOK) FLAGS = (POK,pPOK) PV = 0x455cf00 "2" PV = 0x455cf00 "2" CUR = 1 CUR = 1 LEN = 10 LEN = 10 COW_REFCNT = 1 COW_REFCNT = 1 SV = PV(0x4533720) at 0x4550b90 SV = PV(0x4533720) at 0x4550b90 REFCNT = 2 REFCNT = 2 FLAGS = (POK,pPOK) PV = 0x455f210 "aaa" PV = 0x455f210 "aaa" CUR = 3 CUR = 3 LEN = 10 LEN = 10 COW_REFCNT = 1 COW_REFCNT = 1 看看FLAGS.当提供数字时,数字的字符串化被缓存(存储在标量中)以供将来使用.这是提到的副作用. Looks_like_number返回的值有时是FLAGS [2]的一部分.这就是返回的具体值变化的原因.如果之前返回true,它仍将返回true,如果之前返回false,它仍将返回false. > illguts提供有关标量格式的信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |