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