【发布时间】:2016-08-04 17:43:03
【问题描述】:
我有一个带有键和值(数组)的散列。我想将它们转储到电子表格中,但难以安排它们。
%hash
key1 -> 富吧
key2-> 约翰·亚当·吉尔
key3-> 苹果香蕉芒果橙
代码:
use strict;
use warnings;
use Excel::Writer::XLSX;
my $pattern = "BEGIN_";
my $format;
my @keys = qw(key1 key2 key3);
foreach my $key(@keys){
open my $fh, "<","filename.txt" or die $!;
while ( <$fh> ) {
if (/$pattern/) {
push(@matching_lines, $_);
}
}
$hash{$key} = [@matching_lines] ;
for (@matching_lines) { $_ = undef } ; #Emptying the array contents,to reuse it for for all the other keys
}
my $workbook = Excel::Writer::XLSX->new( 'c:\TEMP\filename.xlsx' );
if (not defined $workbook)
{
die "Failed to create spreadsheet: $!";
}
my $worksheet = $workbook->add_worksheet();
# Add and define a format
$format = $workbook->add_format();
$format->set_bg_color( 'yellow' );
my $row = 1;
my $col = 0;
foreach my $k (keys %hash)
{
$worksheet->write($row, $col, $k, $format); # title
$worksheet->write_col($row+1, $col, $hash{$k}); #value
$col++;
}
$workbook->close() or die "Error closing file: $!";
电流输出
【问题讨论】:
-
您的示例中有一些拼写错误。缺少
my,使用%hash和%tools没有意义。我修复了这些并运行它,这给了我正确的输出,但第 1 行和 A 列是空的。它从 B2 开始,但看起来完全正确。我认为您的 minimal reproducible example 可以作为您的真实代码执行其他操作。 -
@simbabque 感谢您指出错别字。我已经纠正了他们。我已经仔细检查了我的代码并再次运行,但输出仍然与上面提到的当前输出相同。不确定,我错过了什么
-
您能否在循环中包含
print $row . "\n";以验证$row没有被递增? -
@Mr.Llama 这给了我输出
1 1 1。$row没有增加,这就是标题(key2和key 3)打印正确的原因。但是为什么只有价值观才能获得空间。我尝试在 excel 之外打印哈希值,结果没有任何空格 -
您能否将
use Data::Dumper;添加到脚本的开头并在foreach 循环之前包含print Dumper($hash);?