Perl打印功能的副作用

前端之家收集整理的这篇文章主要介绍了Perl打印功能的副作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道为什么/如何在Perl中打印可能会产生副作用.

use Scalar::Util qw/looks_like_number/; 

my @A = (5,'2','aaa',1,'aab'); 

my @a = map { looks_like_number($_) } @A; 
print "1) @a\n";
# prints "4352 1 0 4352 0"

print "A print with a side-effect: @A\n";

@a = map { looks_like_number($_) } @A; 
print "2) @a\n";
# 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 "@A\n";
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"\0
                                     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"\0               PV = 0x455cf00 "2"\0
  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"\0             PV = 0x455f210 "aaa"\0
  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提供有关标量格式的信息.
>见Behavior of Scalar::Util’s looks_like_number.

猜你在找的Perl相关文章