2013-02-11 4 views
1

Я работаю над автоматизацией создания документа Word в Perl с помощью Win32::OLE. Мой текущий код выглядит следующим образом, и он покидает экземпляры WINWORD.EXE в памяти:Чистый способ написать OLE-код в Perl?

my $range = $select->Range; 
my $table = $doc->Tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    for my $colnum (0 .. $#{ $rows[$rownum] }) { 
     my @cellpos = ($rownum + 1, $colnum + 1); 
     my $data = $rows[$rownum][$colnum]; 
     $table->Cell(@cellpos)->Range->{'Text'} = $data; 
     1; 
    } 
} 

Однако, если бы я, чтобы реорганизовать свой код согласно Microsoft recommendation for Visual Studio .NET, это будет выглядеть следующим образом:

my $range = $select->Range; 
my $tables = $doc->Tables; 
my $table = $tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    for my $colnum (0 .. $#{ $rows[$rownum] }) { 
     my @cellpos = ($rownum + 1, $colnum + 1); 
     my $data = $rows[$rownum][$colnum]; 
     my $cell = $table->Cell(@cellpos); 
     my $cell_range = $cell->Range; 
     $cell_range->{'Text'} = $data; 
    } 
} 

Этот код выполняет эту работу, но мне это ужасно «шумно». Есть ли более чистый способ сделать это?

ответ

1

Его можно улучшить незначительно. Нет необходимости в переменных @cellpos и $data, и более аккуратно извлекать ссылку на текущий элемент @rows для использования во внутреннем цикле.

my $range = $select->Range; 
my $tables = $doc->Tables; 
my $table = $tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    my $cols = $rows[$rownum]; 
    for my $colnum (0 .. $#$cols) { 
     my $cell = $table->Cell($rownum + 1, $colnum + 1); 
     my $cell_range = $cell->Range; 
     $cell_range->{Text} = $cols->[$colnum]; 
    } 
}