【发布时间】:2011-10-17 13:52:03
【问题描述】:
我有一个 Perl 脚本,其相关部分张贴在下面。
# Pull values from cells
ROW:
for my $row ( $row_min + 1 .. $row_max ) {
my $target_cell = $worksheet->get_cell( $row, $target_col);
my $response_cell = $worksheet->get_cell( $row, $response_col);
if ( defined $target_cell && defined $response_cell ) {
my $target = $target_cell->value();
my $response = $response_cell->value();
# Determine relatedness
my $value = $lesk->getRelatedness($target, $response);
# Copy output to new Excel spreadhseet, 'data.xls'
my $workbook1 = Spreadsheet::WriteExcel->new('data.xls');
my $worksheet1 = $workbook1->add_worksheet();
$worksheet1->set_column(0, 3, 18);
my $row = 0;
foreach ($target) {
$row++;
$worksheet1->write( $row, 0, "Target = $target\n");
$worksheet1->write( $row, 1, "Response = $response\n");
$worksheet1->write( $row, 2, "Relatedness = $value\n");
}
}
}
此脚本使用 Perl 模块 ParseExcel 和 WriteExcel。输入数据电子表格是两列下的单词列表,一列标记为“目标”,另一列标记为“响应”。该脚本获取每个目标词和每个响应词,并计算它们之间的相关性值(这就是
$lesk->getRelatedness
部分代码正在做。它正在调用一个名为 WordNet::Similarity 的 perl 模块,用于计算单词之间的相关性度量)。
所有这些都可以正常工作。问题是我正在尝试将输出(相似性度量,或此脚本中的 $value)写入新的 Excel 文件。无论我对代码做什么,它给我的唯一输出是 LAST 目标和响应词之间的相关性。它忽略了所有其余部分。
但是,这只发生在我尝试写入 Excel 文件时。如果我改用“打印”功能,我可以在命令窗口中看到所有输出。我总是可以将其复制并粘贴到 Excel 中,但如果我可以自动执行此操作会容易得多。知道问题是什么吗?
【问题讨论】:
-
foreach ($target)是一个无用的循环。$target是一个单值变量,循环只会执行一次,而$row始终为 1(因为它被重置为 0)。此外,如果您使用了 strict 和 warnings,您应该会收到关于第二个$row变量的警告,该变量覆盖了之前定义的变量。 -
我确实使用了严格和警告。它没有给我任何错误信息。您对如何替换 foreach 循环有什么建议吗?是否可以将每个 $target 和 $response 值保存为数组中的元素?
-
此代码会出错,因为您在同一范围内的两个地方声明了
my $row。如果没有,那么有些东西是可疑的。正如我所说的 foreach 循环是无用的,因为标量值只能有 1 个值。在不知道你想要完成什么的情况下,很难说如何解决它。但是,由于您正在(过度)写入相同的$row,因此您只能看到打印的最后一个值。 -
我已经通过严格和警告多次运行它,没有错误。我已经描述了我想要完成的事情,我不知道如何进一步解释它。如果标量值一次只能有 1 个值,有没有办法将其转换为数组?而且我不再覆盖同一个 $row,因为 $row 不再设置为 0(见下文)。
-
您应该更新您的问题以反映对您的脚本所做的更改。