Perl @ $ значение синтаксиса - PullRequest
0 голосов
/ 06 июля 2018

Я адаптировал фрагмент кода для получения имен столбцов в 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 должна быть скалярной, а не массивом?

Надеюсь, вы можете уточнить это, потому что я довольно смущен: (

Спасибо заранее, Fabio

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Здесь $databaseStatement->{NAME} возвращает массив ref.

$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.

0 голосов
/ 06 июля 2018

Вы заявляете, что «адаптировали фрагмент кода для получения имен столбцов в 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}) { ...
...