值的哈希正确打印到csv,但数组值的哈希混淆了我的csv文件。请找到我的代码下面是不工作。
< use strict;
use warnings;
use Data::Dumper;
my %student_hash;
my $student_report = "StudentReport.csv";
%student_hash = (
'RollNummber1' => {
'studentname' => 'Boris',
'address' => ['Vietnam',
'local'
],
'DOB' => '5june2000'
},
'RollNummber2' => {
'studentname' => 'John',
'address' => [
'4th/floor',
'Culverdown/Street',
'WestHam',
'UK.',
],
'DOB' => '2feb2000'
},
'RollNummber3' => {
'studentname' => 'Karen',
'DOB' => '5march2000'
}
);
print "StudentHash:".Dumper(%student_hash);
open(my $fh, '>', $student_report) or die("Couldn't open ile");
print $fh "DOB t,ADDRESS t,NAME tn";
foreach my $key(keys %student_hash){
foreach my $secondkeys (keys %{$student_hash{$key}}){
if($secondkeys =~ /DOB || studentname/) {
print $fh "$student_hash{$key}{$secondkeys} t,"; }
if($secondkeys =~ /address/) {
print $fh Dumper $student_hash{$key}{$secondkeys} };
}
print $fh "n";
}
close($fh);>
如果我注释掉打印数组部分,那么代码工作正常。有人可以建议如何打印数组元素csv无论是在一个单元格或在多个单元格。由于
使用Text::CSV
-如果你有一个数组引用要打印,你可以使用print
。(它为你处理报价)。
或者您可以使用column_names
设置列的顺序,并使用print_hr
以该顺序输出哈希ref。
看起来你不担心RollNumber
,所以你可以作弊,并做:
foreach my $student ( values %student_hash ) {
}
迭代。我不清楚你想用address
做什么。但一个简单的join
可能就能解决这个问题。(根据所需的输出,使用换行或空白)。
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my %student_hash = (
'RollNummber1' => {
'studentname' => 'Boris',
'address' => [ 'Vietnam', 'local' ],
'DOB' => '5june2000'
},
'RollNummber2' => {
'studentname' => 'John',
'address' => [ '4th/floor', 'Culverdown/Street', 'WestHam', 'UK.', ],
'DOB' => '2feb2000'
},
'RollNummber3' => {
'studentname' => 'Karen',
'DOB' => '5march2000'
}
);
my $csv = Text::CSV->new( { sep_char => ',', eol => "n" } );
$csv->column_names( 'studentname', 'DOB', 'address' );
foreach my $student ( values %student_hash ) {
if ( defined $student -> {address} ) {
$student -> {address} = join (" ", @{$student->{address}});
}
$csv->print_hr( *STDOUT, $student );
}