LINUX.ORG.RU

вопрос по перл


0

0

есть хэш, что-то вроде:

my %switcher_0 = (
  '00FB' => \&node_1,
  '0341' => \&node_124,
  '0143' => \&node_12846,
  "\n" => sub { return },
);

есть код:

sub node_0
{
  $parameter[ 5 ] = fetch_parameter( 'ID' );
  my $fref = $switcher_0{ $parameter[5] }();
  if (defined($fref))
  {
    &$fref();
  }
  else
  {
    &$switcher_0{ "\n" }();
  }
}

ругается так:

Global symbol "$switcher_0" requires explicit package name at ruler.pm line 15665.
syntax error at ruler.pm line 15665, near "$switcher_0{ "
syntax error at ruler.pm line 15667, near "}"

15665 это строка     &$switcher_0{ "\n" }();

что не так?
★★★★★

Ответ на: комментарий от asgard

это гуд, но не совсем. Хэш может содержать скажем:

'0143' => sub { return }, "\n" => \&node_1,

то есть нужно наверно как-то изменить саму sub { return } в хэше?

dilmah ★★★★★
() автор топика

<offtopic>
гы..просто к слову пришлось :
два треда почти подряд "вопрос про перл" "вопрос по перл"
по русски темы как-то неоднозначно звучат :)
</offtopic>

MKuznetsov ★★★★★
()
Ответ на: комментарий от dilmah

а, все, понял, нужно убрать & как ты сказал и убрать скобки здесь:

my $fref = $switcher_0{ $parameter[5] }();

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Не, но отсутствие логики в перл меня убивает.

Так писать правильно:

$fref = $switcher_0{ "\n" }; &$fref();

Но если попытаться слить это в одну строку:

&$switcher_0{ "\n" }();

она уже неправильна, нужно убрать &

Кстати, а где-нибудь есть формальная спецификация перла? Уж до чего С++ монстр, но стандарт таки написали. У меня однокурсник на кафедре логики даже писал диплом (в 90-х годах) на тему спецификации С++.

перл же явно безнадежен.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> это гуд, но не совсем. Хэш может содержать скажем:

> '0143' => sub { return }, "\n" => \&node_1,

дык $var = $your_hash{'key'}; &$var() - то же самое, что и $your_hash('key')->()

asgard
()
Ответ на: комментарий от dilmah

> Не, но отсутствие логики в перл меня убивает.

Зря, логика железная

$fref = $switcher_0{ "\n" }; &$fref();

присвоить указателю fref значение указателя switcher_0{"\n"};выполнить байткод по указателю fref как функцию.

&$switcher_0{ "\n" }();

выполнить значенине указателя как функцию

&$switcher_0{ "\n" }->();

выполнить байткод по указателю fref как функцию.

Обычная путаница с "значением указателя" и "значением по указателю"

iBliss
()

>&$switcher_0{ "\n" }(); надо скобки поставить &{$switcher_0{ "\n" }}();

before
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.