什么是Perl中的“字符串化”?

时间:2011-03-07 00:24:49

标签: perl

在CPAN模块DateTime的文档中,我发现了以下内容:

  

设置格式化程序后,即可   重载的字符串化方法会   使用格式化程序。

似乎有一些叫做“字符串化”的Perl概念我不知何故错过了。谷歌搜索没有说清楚。什么是“字符串化”?

3 个答案:

答案 0 :(得分:50)

只要perl需要将值转换为字符串,就会发生“stringification”。这可能是打印它,将它与另一个字符串连接起来,对它应用正则表达式,或者在Perl中使用任何其他字符串操作函数。

say $obj;
say "object is: $obj";
if ($obj =~ /xyz/) {...}
say join ', ' => $obj, $obj2, $obj3;
if (length $obj > 10) {...}
$hash{$obj}++;
...

通常,对象将字符串化为类似Some::Package=HASH(0x467fbc)的内容,其中perl正在打印它所包含的包,以及引用的类型和地址。

某些模块选择覆盖此行为。在Perl中,这是使用overload pragma完成的。下面是一个对象的示例,当字符串化生成其总和时:

{package Sum;
    use List::Util ();

    sub new {my $class = shift; bless [@_] => $class}

    use overload fallback => 1,
        '""' => sub {List::Util::sum @{$_[0]}}; 

    sub add {push @{$_[0]}, @_[1 .. $#_]}
}

my $sum = Sum->new(1 .. 10);

say ref $sum; # prints 'Sum'
say $sum;     # prints '55'
$sum->add(100, 1000);
say $sum;     # prints '1155'

overload允许您定义的其他几个章节:

'bool' Boolification    The value in boolean context   `if ($obj) {...}`
'""'   Stringification  The value in string context    `say $obj; length $obj`
'0+'   Numification     The value in numeric context   `say $obj + 1;`
'qr'   Regexification   The value when used as a regex `if ($str =~ /$obj/)`

对象甚至可以表现为不同的类型:

'${}'   Scalarification   The value as a scalar ref `say $$obj`
'@{}'   Arrayification    The value as an array ref `say for @$obj;`
'%{}'   Hashification     The value as a hash ref   `say for keys %$obj;`
'&{}'   Codeification     The value as a code ref   `say $obj->(1, 2, 3);`
'*{}'   Globification     The value as a glob ref   `say *$obj;`

答案 1 :(得分:7)

在期望字符串的上下文中使用对象时,将调用字符串化方法。该方法描述了如何将对象表示为字符串。因此,例如,如果你说print object;那么因为print期望一个字符串,它实际上是将stringify方法的结果传递给print。

答案 2 :(得分:1)

只是添加上面的答案,用java来比喻......

与Java中的Object.toString()非常相似。 Omni-present默认存在但在需要时可能会被覆盖。