【问题标题】:Perl hash strict ref error in spreadsheet电子表格中的 Perl 哈希严格引用错误
【发布时间】:2017-04-08 13:38:22
【问题描述】:

下面是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

解决办法是什么?

【问题讨论】:

  • 你能试试format the code吗?
  • 个人建议,也许看看Excel::Writer::XLSX,如果这符合您的要求,它也有非常好的文档。我并不是暗示这将是一个解决方案,我只是将其视为一个更简单的 excel 编写器:)

标签: perl spreadsheet strict refs


【解决方案1】:

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

对 ${path_1} 的不明确使用解析为 $path_1

最好将其替换为 my $path_1

你的实际问题是这一行:

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

您正在尝试使用称为“符号引用”的东西(也称为“使用变量作为变量的名称”)。对于all sortsreasons 来说,它们是一个非常糟糕的主意——这就是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;
}

【讨论】:

    【解决方案2】:

    声明变量时不要使用花括号。使用:

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

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

    【讨论】:

    • 好的。然后如何初始化一个包含“_”的标量。如果说 print $path_1,它不会寻找 $path 变量而不是 $path_1 吗?
    • 在 Perl 中,_ 可以是变量的一部分。因此,如果您创建 $path_1 变量,您的变量将被命名为 $path_1 并且 print $path_1 将打印 $path_1 内容。 _ 本身在 Perl 中没有特殊含义。
    • 声明变量时不能使用花括号 - 这不是真的。这是一件毫无意义的事情,但没有什么能阻止你这样做。
    • @DaveCross,你说得对,我会尝试改写我的答案。
    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2019-03-01
    • 2017-12-20
    • 2021-09-23
    • 2019-06-11
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多