2012-01-16 9 views
6

¿Qué pasa con el código de abajo? Cuando se ejecuta, me sale: "Uso del valor no inicializado en la concatenación o una cadena en la línea ./main.pl 14 (.)"usando localtime dentro de alose valores por defecto

#!/usr/bin/perl 

package Test; 

use Moose; 

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{{(localtime)[2] => {(localtime)[3] => "hello"}}}); 

# the one below works fine 
#has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{{"18" => {"16" => "hello"}}}); 

sub show { 
    my $self = shift; 
    print("Test: " . $self->message->{(localtime)[2]}->{(localtime)[3]} . "\n"); 
} 

my $o = Test->new(); 
$o->show(); 

Si yo no uso localtime() entonces funciona bien. También localtime [2] y [3] no cambian muy a menudo (2 es horas, 3 es mes día) así que el problema no es eso. Si funciono el guión con un depurador, me sale:

x $self 
0 Test=HASH(0x3597300) 
    'message' => HASH(0x3597618) 
     16 => 'hello' 

Así que parece como si me pierdo 'un nivel de indirección, no entendemos para qué ... ¿Alguna idea?

Respuesta

10

El exterior {} no se analiza como hashref. Añadir una explícita return:

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{ return {(localtime)[2] => {(localtime)[3] => "hello"}} }); 

Un + para forzar esto funciona, también.

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{ +{(localtime)[2] => {(localtime)[3] => "hello"}} }); 
+0

Funciona bien, gracias – mbonnin

+0

Solo para mi comprensión: ¿qué hace el análisis externo {} como en este caso? ¿Es solo ignorado? – mbonnin

+0

Bien, entendido, esta pregunta lo responde: http://stackoverflow.com/questions/1617546/whats-the-history-of-the-in-front-of-a-hashref-that-disambiguates-from-a- código Gracias de nuevo. – mbonnin

Cuestiones relacionadas