Perl @ $语法含义

时间:2018-07-06 01:21:55

标签: arrays perl scalar

我已经修改了一个代码片段来获取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 是标量而不是数组?

希望您可以澄清一下,因为我很困惑:(

预先感谢, 法比奥

2 个答案:

答案 0 :(得分:4)

在这里,$databaseStatement->{NAME}返回一个数组引用。

$tableColumns = $databaseStatement->{NAME};

如果您要print $tableColumns,将会看到类似ARRAY(0x18af700)的内容。

因此它正在存储数组引用,您如何访问该数组?您取消引用

for my $entry ( @{ $tableColumns } ) { ... }

@$tableColumns只是用于取消引用的简写语法。


那么这一切的理由是什么?

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";
}

请注意,我不能在此处使用简写@$characters{simpsons},但是如果我使用my $simpsons = $characters{simpsons},则可以遍历@$simpsons

答案 1 :(得分:1)

您声明您已经“修改了代码片段以在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 将返回数组引用。 Perl 5中的数组引用是标量,并以'$'标记表示。要遍历该arrayref的元素,您需要取消引用arrayref。您可以使用以下任一方法来做到这一点:

foreach (@$tableColumns) { ...

或更正式地说:

foreach (@{$tableColumns}) { ...