используя localtime внутри лося по умолчанию - PullRequest
6 голосов
/ 16 января 2012

Что не так с кодом ниже? При запуске я получаю: «Использование неинициализированного значения в конкатенации (.) Или строки в строке ./main.pl 14»

#!/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();

Если я не использую localtime (), тогда он работает нормально. Также местное время [2] и [3] меняются не очень часто (2 - часы, 3 - день месяца), поэтому проблема не в этом. Если я запускаю скрипт с отладчиком, я получаю:

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

Так что, похоже, я "теряю" один уровень косвенности, не совсем уверен, почему ... Есть идеи?

1 Ответ

10 голосов
/ 16 января 2012

Внешнее {} не разбирается как хэшреф. Добавить явное return:

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

A +, чтобы заставить это работать тоже.

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