Как мне ссылаться на скаляр в ссылке на хеш в Perl? - PullRequest
0 голосов
/ 25 ноября 2008

Простой вопрос:

Как мне сделать это в одной строке:

my $foo = $bar->{baz};
fizz(\$foo);

Я пробовал \ $ bar -> {baz}, \ $ {$ bar -> {baz}} и многие другие. Это вообще возможно?

-fREW

Обновление : Хорошо, хэш-ссылка исходит от DBI, и я передаю скалярную ссылку в шаблонный инструментарий. Теперь я думаю, что при более внимательном рассмотрении проблема связана с тем, как ТТ делает все это. По сути, я хочу сказать:

$template->process(\$row->{body}, $data);

Но TT не работает таким образом, TT берет скалярную ссылку и помещает туда данные, поэтому мне придется сделать следующее:

$template->process(\$row->{body}, $shopdata, \$row->{data});

В любом случае, спасибо за помощь. У меня будет хотя бы одна ссылка вместо двух.

Ответы [ 4 ]

5 голосов
/ 25 ноября 2008
\$bar->{baz}

должно работать.

например:.

my $foo;
$foo->{bar} = 123;

my $bar = \$foo->{bar};

$$bar = 456;

print "$foo->{bar}\n";   # prints "456"

В ответ на обновление в ОП вы можете сделать:

\@$row{qw(body data)};

Это не то же самое, что \ @array, который создает одну ссылку на массив. Выше будет распространять ссылку и составить список из двух ссылок.

4 голосов
/ 25 ноября 2008

\ $ bar -> {baz}, кажется, справляются со мной:

my $bar = { baz => 1 };
print $bar->{baz}, "\n";  # prints 1
my $ref =  \$bar->{baz};
print $$ref, "\n";        # prints 1
$$ref = 2;
print $bar->{baz}, "\n";  # prints 2 
2 голосов
/ 25 ноября 2008

Вы не показали, как были настроены% bar и fizz (), поэтому я настроил их так:

my %hash;
my $bar = \%hash;
$hash{baz} = "found it\n";
sub fizz {
  my $ref = shift;
  print $$ref;
}

Тогда обе эти работы, ваш оригинал:

my $foo = $bar->{baz};
fizz(\$foo);

и один из вариантов, который вы сказали, что попробовал:

fizz(\$bar->{baz});

Можете ли вы показать ошибку, которая вам дает?

0 голосов
/ 25 ноября 2008

Я даже не уверен, что ты делаешь. Вы также должны поставить кавычки вокруг базы.

Теперь давайте рассмотрим, что вы назначаете скаляр скаляру в первой строке, тогда вторая строка должна работать. Однако я не знаю, действительно ли это то, что вы пытаетесь сделать, и это не имеет смысла в Perl. Использование ссылок часто используется на других языках для

  1. ускорить вызов функции
  2. разрешить возврат нескольких значений.

Теперь первое обычно не требуется для скаляров, и в любом случае Perl - это язык сценариев, так что если вы действительно обеспокоены скоростью записи C.

Второе не нужно в Perl, так как вы можете легко возвращать списки и ссылки на анонимные хеши.

Вы смотрели на "man perlref"?

...