Perl @$ 语法含义
Perl @$ syntax meaning
我修改了一个代码片段来获取 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行我需要使用@$,当我遍历语句执行返回的headers时。另外,为什么变量 $tableColumns 是标量而不是数组?
希望你能澄清一下,因为我很困惑:(
提前致谢,
法比奥
你说你有 "adapted a code fragment for getting column names in DBI",但你是如何从 DBI 库达到这一点的并不明显。
阅读 perldoc DBI,我最接近的检索列名的方法是:
"column_info"
$sth = $dbh->column_info( $catalog, $schema, $table, $column );
# then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
$sth->fetchall_arrayref 会 return 一个数组引用。 Perl 5 中的数组引用是一个标量,用“$”标记表示。要迭代该 arrayref 的元素,您需要取消对 arrayref 的引用。您可以使用以下任一方法来做到这一点:
foreach (@$tableColumns) { ...
或者,更正式地说:
foreach (@{$tableColumns}) { ...
在这里,$databaseStatement->{NAME}
returns 一个数组引用。
$tableColumns = $databaseStatement->{NAME};
如果你 print $tableColumns
你会看到 ARRAY(0x18af700)
.
所以它存储了一个数组引用,您如何访问该数组?您 取消引用 它。
for my $entry ( @{ $tableColumns } ) { ... }
@$tableColumns
只是 shorthand 取消引用的语法。
那么这一切的理由是什么?
Perl 不允许您将列表存储在数组中或作为散列值;您只能存储标量值。这包括 references,然后允许您将对数组或哈希的引用存储在另一个数组或哈希中。
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";
}
请注意,我不能在此处使用 shorthand @$characters{simpsons}
,但如果我使用 my $simpsons = $characters{simpsons}
,则可以遍历 @$simpsons
。
我修改了一个代码片段来获取 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行我需要使用@$,当我遍历语句执行返回的headers时。另外,为什么变量 $tableColumns 是标量而不是数组?
希望你能澄清一下,因为我很困惑:(
提前致谢, 法比奥
你说你有 "adapted a code fragment for getting column names in DBI",但你是如何从 DBI 库达到这一点的并不明显。
阅读 perldoc DBI,我最接近的检索列名的方法是:
"column_info"
$sth = $dbh->column_info( $catalog, $schema, $table, $column );
# then $sth->fetchall_arrayref or $sth->fetchall_hashref etc
$sth->fetchall_arrayref 会 return 一个数组引用。 Perl 5 中的数组引用是一个标量,用“$”标记表示。要迭代该 arrayref 的元素,您需要取消对 arrayref 的引用。您可以使用以下任一方法来做到这一点:
foreach (@$tableColumns) { ...
或者,更正式地说:
foreach (@{$tableColumns}) { ...
在这里,$databaseStatement->{NAME}
returns 一个数组引用。
$tableColumns = $databaseStatement->{NAME};
如果你 print $tableColumns
你会看到 ARRAY(0x18af700)
.
所以它存储了一个数组引用,您如何访问该数组?您 取消引用 它。
for my $entry ( @{ $tableColumns } ) { ... }
@$tableColumns
只是 shorthand 取消引用的语法。
那么这一切的理由是什么?
Perl 不允许您将列表存储在数组中或作为散列值;您只能存储标量值。这包括 references,然后允许您将对数组或哈希的引用存储在另一个数组或哈希中。
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";
}
请注意,我不能在此处使用 shorthand @$characters{simpsons}
,但如果我使用 my $simpsons = $characters{simpsons}
,则可以遍历 @$simpsons
。