2011-03-07 36 views
22

En la documentación del módulo CPAN DateTime me encontré con lo siguiente:¿Qué es "stringification" en Perl?

Una vez ajustado el formateador, el método sobrecargado stringification se utilizar el formateador.

Parece que hay algún concepto de Perl llamado "stringification" que de alguna manera me perdí. Google no lo ha aclarado mucho. ¿Qué es esta "cadena"?

Respuesta

48

"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;` 
+0

+1 pero probablemente debería usar 'sub new {bless [@_ [1 .. $ # _]], $ _ [0]}'. –

+0

@Chris => gracias, actualizado ahora para deletrearlo –

+1

@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. –

7

Los métodos de stringificación se invocan cuando un objeto se utiliza en un contexto donde se espera una cadena. El método describe cómo representar el objeto como una cadena. Entonces, por ejemplo, si dice print object;, dado que print espera una cadena, en realidad está pasando el resultado del método stringify para imprimir.

+1

Entonces, ¿es como llamar a un método 'object.toString()'? –

+0

Sí, pero se llama implícitamente cada vez que se necesita una cadena. – ikegami

1

Simplemente agregando a la respuesta anterior, para dibujar una analogía con java ...

Muy similar a Object.toString() en Java. Omni-presente por defecto, pero podría ser anulado cuando sea necesario.