"stringification" ocurre cada vez que perl necesita convertir un valor en una cadena. Esto podría ser imprimirlo, concatenarlo con otra cadena, aplicarle una expresión regular o usar cualquiera de las otras funciones de manipulación de cadenas en Perl.
say $obj;
say "object is: $obj";
if ($obj =~ /xyz/) {...}
say join ', ' => $obj, $obj2, $obj3;
if (length $obj > 10) {...}
$hash{$obj}++;
...
Normalmente, los objetos se stringify a algo así como Some::Package=HASH(0x467fbc)
donde Perl está imprimiendo el paquete que ha sido bendecida en, y el tipo y dirección de la referencia.
Algunos módulos eligen anular este comportamiento. En Perl, esto se hace con el pragma overload. A continuación se muestra un ejemplo de un objeto que cuando Stringified produce su suma:
{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'
Hay varias otras ficaciones que overload
permite definir:
'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/)`
Los objetos pueden incluso comportarse como diferentes tipos:
'${}' 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 pero probablemente debería usar 'sub new {bless [@_ [1 .. $ # _]], $ _ [0]}'. –
@Chris => gracias, actualizado ahora para deletrearlo –
@Eric - Muy bien. Me gustaría seguir con el estilo que usaste para 'agregar', pero prefiero la forma en que lo tienes ahora en general. –