📜  Perl 中的强制转换

📅  最后修改于: 2022-05-13 01:55:10.913000             🧑  作者: Mango

Perl 中的强制转换

在 Perl 中,有不同类型的值,例如字符串、整数、有理数等等。强制转换负责将数据或对象的一种数据类型转换为另一种数据类型,在幕后我们神奇地得到了我们想要的东西。它通常是指“隐式类型转换”,这也是将一种数据类型的实体转换为另一种数据类型的一种方式。

最常见的强制形式是重载 pragma ,以及在 Perl 编程中的字符串重载。在这种情况下,我们的对象被自动强制转换为字符串(在 Perl 本身中)。
用于高阶强制的强制类型是Params::Coerce ,主要用于子程序和方法参数。

强制类型

强制类型解释如下:

  • 布尔强制:布尔强制可用于测试值的真实性,就像在 if 或 while 条件中一样。所有数字 0、undef、空字符串和字符串'0' 都被评估为假值。所有其他值,包括数值为零的字符串(如 '0.0'、'0e' 和 '0 but true') - 评估为真值。
    当标量同时包含字符串和数字分量时,Perl 最好检查字符串分量的布尔值。 '0 but true' 在数值上计算为零,但不是空字符串,因此它在布尔上下文中被计算为真值。

    例子:

    say ?^True; # Falsesay ?^'';   # Truesay ?^0;    # Truesay ?^42;   # False

    ( ? 前缀运算符是布尔强制运算符。它将其操作数转换为布尔值。)

  • 字符串强制:字符串强制在我们使用比较(eq 和 cmp)、连接、拆分、substr 和正则表达式等字符串运算符,以及使用值或表达式作为哈希键时起作用。然后将未定义的值字符串化为空字符串,但会产生“使用未初始化值”警告。数字字符串化为包含其值的字符串。 (stringify = 返回一个字符串)

    例子:

    use strict;
    use warnings;
    my $x = "4T"; # string
    my $y = 3;    # integer
    my $z = $x.$y;
    print $z;     # coerced
    
    输出:
    4T3
  • 数字强制:当我们使用数字运算符(例如 == 和 <=>),执行数学运算或使用表达式或值作为数组或列表索引时,会发生数字强制。然后,未定义的值变为零并给我们一个“使用未初始化的值”警告。不以任何数字部分开头的字符串numify 为零,并向我们发出“Argument is not numeric”的警告。并且以数字字面量中允许的字符开头的那些 numify 为指定的值并且不产生警告。 (numify = 返回一个数字)。
    Perl函数中还有一个函数,它使用与 Perl 语法相同的解析规则从核心模块Scalar::Util中包含的looks_like_number()字符串中提取数字。

    例子:

    my $a = "23B";
    $a +=0;
      
    # string part has been removed automatically.
    print $a; 
    
    输出:
    23
  • 引用强制:当我们对非引用使用解引用操作时,它会将值转换为引用。这个过程被称为自动存活。这个过程在操作嵌套数据结构时很方便。
    例子:
    my %users;
    $users{John}{id} = 128;
    $users{Thomas}{id} = 129;
    

    解释:正如我们在此看到的,散列不包含 John 和 Thomas 的值,但 Perl 为他们创建了散列引用,为他们每个人分配了一个键/值对,键值在 id 上。

  • 缓存强制: Perl 中值的内部表示同时存储字符串和数值。就像我们对值进行字符串化一样,它不会替换数值,而是将字符串化值添加到内部表示中,该表示随后由两个组件组成。同样,当我们对字符串值进行数字化时,它会填充数值并保持字符串组件不变。
    例如:某些 Perl运算符通常更喜欢使用一个值而不是另一个值(就像布尔检查更喜欢字符串一样)。如果有一个值以我们不期望的形式缓存了表示,那么依赖隐式转换可能会产生一些令人惊讶的结果。了解这是如何发生的可能有助于我们诊断一些奇怪的情况。

双变量

Perl 具有多组件特性,用户可以使用双变量的形式。函数dualvar() 由核心模块 Scalar :: Util 提供,它允许我们绕过 Perl 强制并分别操作值的字符串和数字组件。

use Scalar::Util qw(blessed dualvar set_prototype);
$foo = dualvar 10, "Geeksfor";
$num = $foo + 2;                   
$str = $foo . " Geeks";             
print "$num\n";
print $str;
输出:
12
Geeksfor Geeks