我已经修改了一个代码片段来获取DBI中的列名,并且工作正常:
$tableColumns = $databaseStatement->{NAME};
print $fileHandle $documentFormatter->{openTableRow};
foreach(@$tableColumns){
print $fileHandle $documentFormatter->{openTableHeader};
print $fileHandle $_;
print $fileHandle $documentFormatter->{closeTableHeader};
}
print $fileHandle $documentFormatter->{closeTableRow};
但是,我不完全理解为什么在第3行中,当我遍历语句执行返回的标头时需要使用@ $。还有为什么变量$ tableColumns是标量而不是数组?
希望您能澄清一下,因为我很困惑:(
提前致谢,
法比奥
最佳答案
在这里,$databaseStatement->{NAME}
返回数组引用。
$tableColumns = $databaseStatement->{NAME};
如果您要访问
print $tableColumns
,则会看到类似ARRAY(0x18af700)
的内容。因此,它存储着一个数组引用,您如何访问该数组?您取消引用它。
for my $entry ( @{ $tableColumns } ) { ... }
@$tableColumns
只是用于取消引用的简写语法。那么所有这些的基本原理是什么?
Perl不允许您将列表存储在数组内或作为哈希值;您只能存储标量值。这包括引用,然后允许您例如将对数组或哈希的引用存储在另一个数组或哈希中。
my @simpsons = ('Homer', 'Marge', 'Bart', 'Lisa', 'Maggie');
my %characters = (
simpsons => \@simpsons, # Create references to existing array
flanders => ['Ned', 'Maude', 'Rod', 'Tod'], # Anonymous array-ref
);
$simpsons[2] = 'Bort'; # This will affect the entry in the hash
for my $character ( @{ $characters{simpsons} } ) {
print $character . "\n";
}
请注意,我不能在这里使用速记
@$characters{simpsons}
,但是如果我使用my $simpsons = $characters{simpsons}
,则可以遍历@$simpsons
。