【问题标题】:Perl @$ syntax meaningPerl @$ 语法含义
【发布时间】:2018-12-14 13:25:09
【问题描述】:

我已经修改了一个用于在 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 是标量而不是数组?

希望你能澄清这一点,因为我很困惑:(

提前致谢, 法比奥

【问题讨论】:

  • 有关引用变量的更多信息,请参阅perlref

标签: arrays perl scalar


【解决方案1】:

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

$tableColumns = $databaseStatement->{NAME};

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

所以它存储了一个数组 ref,你如何访问该数组?你取消引用它。

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

【讨论】:

  • 谢谢!我对 Perl 的引用仍然不是很熟悉,但你指出了我正确的方向。
【解决方案2】:

您声明您已“修改了用于在 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 中的数组引用是一个标量,用“$”符号表示。要遍历该数组引用的元素,您需要取消引用该数组引用。您可以通过以下任一方式做到这一点:

foreach (@$tableColumns) { ...

或者,更正式地说:

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

【讨论】:

  • 感谢您的意见。我想我可能会采用您在上一个示例中显示的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多