Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Странный вызов подпрограммы


Автор: Wowa 10.4.2002, 00:59
$temp='Calc';

Как мне теперь через переменную $temp вызвать подпрограмму Calc ?

Автор: *NS* 10.4.2002, 18:20
хмм
а для чего это надо?
по подробнее объясни плз

Автор: Wowa 10.4.2002, 19:01
Поступают скрипту некие параметры, он на них смотрит, и исходя из этого должен запускать соответствующую подпрограмму.
Для простоты понимания: name.pl?sub=edit
Вот мне и надо, глядя на $in{sub} запустить подпрограмму edit

Делать все через
if () {}
elsif {}
elsif {}
.....

не хочется.

Устроил бы вариант типа: &$in{sub};    :D  :D  :D

Есть альтернатива?


Автор: *NS* 11.4.2002, 11:29
по моему нету...
только через иф елзе...

Автор: BlackLFL 15.3.2006, 19:57
Код

my $temp = 'calc';
eval "&$temp();"; 

sub calc {
    print "Executing calc function!";
}

Автор: tishaishii 15.3.2006, 23:22
Нафига?

Код
my$sub='calc';
$sub->(@args);


Код
my$sub='calc';
&$sub(@args);


Код
&{
   #Ну я вообще не знаю какую подпрограмму запустить, а запущу-ка я...
   my$chego_puskat'to='?';
   if($chego_puskat'to eq '?') {
     +\'calc'
  } else {
     +\'ne_calc'
  }
}(@args);

Автор: arto 15.3.2006, 23:30
1. *f = "func"; f();
2. %h = ('func' => \&func); $h{'func'}();

Автор: sharq 16.3.2006, 11:56
Wowa,
Цитата(Wowa @ 10.4.2002, 20:01 Найти цитируемый пост)
Поступают скрипту некие параметры, он на них смотрит, и исходя из этого должен запускать соответствующую подпрограмму.
Для простоты понимания: name.pl?sub=edit
Вот мне и надо, глядя на $in{sub} запустить подпрограмму edit

Делать все через
if () {}
elsif {}
elsif {}
.....

не хочется.

Устроил бы вариант типа: &$in{sub};    smile  smile  smile

Есть альтернатива?


Я считаю, что так не разумно!
Нужно определено писать и названия ключа и значения не должны совпадать с названиями функциями, как же безопастность??? Плюс - вдруг захочешь поменять название функции или ключа, тогда как быть?
Так что подумай, может лучше все-таки написать пару строк. smile

smile

Автор: regis 16.3.2006, 13:04
Запихнуть в хэш имена параметров в качестве ключей, и ссылки на функции -- в качестве значений.
Куда более элегантное, и проще сопровождаемое решение, чем верница if/else...

Автор: nitr 16.3.2006, 16:19
См. в форуме любую замену switch/C =)

Автор: tishaishii 18.3.2006, 01:31
Код
calc: #подпрограммаммамма
print @args;
goto end;#конец блока подпрограмммм
#чего-то там ещё
@args=@ARGV; #аргументы для подпрограммммы из коммммандной строки.
goto $temp;
end:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)