电子表格中的Perl哈希严格引用错误

时间:2016-11-24 09:59:55

标签: perl spreadsheet strict refs

以下是perl代码

use Spreadsheet::WriteExcel;

my $workbook = new Spreadsheet::WriteExcel( 'one_worksheet.csv' );

my ${path_1} = $workbook->add_worksheet('Max Input');
my ${path_2} = $workbook->add_worksheet('Min Input');

foreach (keys %max_hash ) {
    ${$_}->write(0, $column, "$max_hash{$_}" );
    $column = $column + 1;
}

我收到此错误

"Can't use string ("path_1") as a SCALAR ref while "strict refs" in use".

%max_hash包含密钥path_1path_2

解决方案是什么?

2 个答案:

答案 0 :(得分:3)

语法my ${path_1}不常见,但实际上并不是问题。启用use warnings后,您会收到一条警告消息:

  

$ {path_1}的模糊使用已解决为$ path_1

最好将其替换为my $path_1

你的实际问题是这一行:

${$_}->write(0,$column,"$max_hash{$_}");

您正在尝试使用名为"符号引用的内容" (也称为"使用变量作为变量的名称")。对all sorts reasons {{3}}来说,这是一个非常糟糕的主意 - 这就是use strict阻止你这样做的原因。

将工作表存储在哈希中会更好。

use Spreadsheet::WriteExcel;

# "Class->new()" is far better than "new Class"
my $workbook = Spreadsheet::WriteExcel->( 'one_worksheet.csv' );
my %worksheets;
$worksheets{path_1} = $workbook->add_worksheet('Max Input');
$worksheets{path_2} = $workbook->add_worksheet('Min Input');
foreach(keys %max_hash) {
    $worksheets{$_}->write(0, $column, $max_hash{$_});
    $column = $column + 1;
}

答案 1 :(得分:0)

在声明变量时,您不会使用花括号。使用:

my $path_1 = $workbook->add_worksheet('Max Input');

${something}语法表示取消引用,因此perl将something视为参考。此外,将它与my一起使用也是错误的。