什么是Perl中的"字符串化"?

Joe*_*Fan 25 perl

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

设置格式化程序后,重载的字符串化方法将使用格式化程序.

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

Eri*_*rom 50

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

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

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

某些模块选择覆盖此行为.在Perl中,这是通过重载编译指示完成的.下面是一个对象的示例,当字符串化生成其总和时:

{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'
Run Code Online (Sandbox Code Playgroud)

还有其他几个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/)`
Run Code Online (Sandbox Code Playgroud)

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

'${}'   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;`
Run Code Online (Sandbox Code Playgroud)


J. *_*lor 7

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