Perl Data :: Dumper показывает объекты вместо значений - PullRequest
6 голосов
/ 01 февраля 2011
 foreach my $row (1..$end) 
 { 
  foreach my $col (3..27 ) 
  { 
    # skip empty cells 
    next unless defined 
    $worksheet->Cells($row,$col)->{'Value'}; 

    # print out the contents of a cell  
    $var = $worksheet->Cells($row,$col)->{'Value'};     
    push @dates, $var;  

    print $var; #this prints the value just fine
  } 
 }  

my %hash;
$hash{'first'} = \@dates;
print Dumper \%hash; #This prints object information 

Я использую модуль OLE для Perl и каждое значение, которое я получаю из своего листа, и печатаю $ var, тогда я получаю ожидаемое значение, но когда я помещаю все в хеш, он печатает:

'first' => [
bless( do{\(my $o = 15375916)}, 'OLE::Variant'), 
bless( do{\(my $o = 15372208)}, 'OLE::Variant'),

И так далее. Я не должен понимать что-то о хешах, потому что я действительно в тупике.

Ответы [ 2 ]

10 голосов
/ 01 февраля 2011

push @dates, $var помещает объект OLE::Variant в массив @dates, тогда как print $var вызывает неявный метод OLE::Variant для преобразования объекта в строку.

Если вы также хотите, чтобы @dates содержал только базовые строковые значения, а не сами объекты, скажем

push @dates, "$var";

, который будет преобразовывать объект даты в строку, прежде чем помещать его в массив @dates.

4 голосов
/ 02 февраля 2011

Значения, возвращаемые вызовом $worksheet->Cells($row,$col)->{'Value'}, являются объектами, которые в основном имеют C / C ++ характер, и Perl имеет только указатель на объект, представленный ячейкой памяти (которую вы видите в дампе как большое целое число),Многие CPAN-модули, которые обертывают базовые библиотеки C / C ++, ведут себя одинаково (на ум приходит XML :: LibXML).Краткий ответ: этот является объектом, и это все, что вы можете увидеть с помощью Data :: Dumper, к сожалению.По сути, они являются благословенными скалярными ссылками, и все операции с ними осуществляются через методы, а не через фактическое значение самой базовой ссылки.

...