Комментарии 16
В перле это просто &{ $a }($b) и никак не является извратом, всё совершенно стандартно.
приведённый вами пример не работает с юз стрикт. будьте внимательнее. А написание скрипта даже среднего размера без юз стрикт — это вредительство и саботаж.
#!/usr/bin/perl -w
use strict;
if(exists $ARGV[0] && exists &{$ARGV[0]}){
#my $func_call = \&{$ARGV[0]};
#&$func_call();
&{$ARGV[0]}();
}
sub test{
print «123\n»;
}
H:\>perl 1.pl test
Can't use string («test») as a subroutine ref while «strict refs» in use at 1.pl line 6.
#!/usr/bin/perl -w
use strict;
if(exists $ARGV[0] && exists &{$ARGV[0]}){
#my $func_call = \&{$ARGV[0]};
#&$func_call();
&{$ARGV[0]}();
}
sub test{
print «123\n»;
}
H:\>perl 1.pl test
Can't use string («test») as a subroutine ref while «strict refs» in use at 1.pl line 6.
Приведенный мной пример работает с use strict, если читать что именно вы копируете в исполнение.
чорт
простите, не заметил, куда вы отвечаете
простите, не заметил, куда вы отвечаете
И тем не менее, в нужном месте лучше просто добавить блок с «no strict 'refs';», ведь это не возможная ошибка, а как раз цель.
Ну если бы Вы немножко почитали о литералах Перла, проблем с написанием такого не возникло бы.
Не могли бы Вы дать ссылку на мануал? А то, боюсь, не то могу найти.
А так — охватить всё сразу невозможно) Задачи решаются по мере их поступлений, и по ходу дела уже роется гугл и мануалы. Но вот в данном примере я немного растерялся — в какой именно мануал рыть.
А так — охватить всё сразу невозможно) Задачи решаются по мере их поступлений, и по ходу дела уже роется гугл и мануалы. Но вот в данном примере я немного растерялся — в какой именно мануал рыть.
По сабжу топика вот (http://www.intuit.ru/department/pl/perl/11/6.html) читайте про символические ссылки.
А вообще всем своим программистам, которые не знакомы с перлом, я говорю пройти этот курс www.intuit.ru/department/pl/perl/) — прокачивает теорию на начальном уровне.
А вообще всем своим программистам, которые не знакомы с перлом, я говорю пройти этот курс www.intuit.ru/department/pl/perl/) — прокачивает теорию на начальном уровне.
О, спасибо что напомнили
Символическими ссылками-то я активно пользуюсь, но не знал раньше (ниже написано), что с сабами можно так.
Я собственно перл и начал фактически учить с этой книжки — у меня на бумаге есть
Просто традиционно читал «между строк» — надо было скорее приступать к работе уже с ним)
Перечитаю опять.
Символическими ссылками-то я активно пользуюсь, но не знал раньше (ниже написано), что с сабами можно так.
Я собственно перл и начал фактически учить с этой книжки — у меня на бумаге есть
Просто традиционно читал «между строк» — надо было скорее приступать к работе уже с ним)
Перечитаю опять.
НЛО прилетело и опубликовало эту надпись здесь
Очень красивый способ, т.к. идёт ещё и проверка на существование данной функции.
Правда dzhariy зря написал «И тут не используются символические ссылки», т.к. метод can возвращает как раз ссылку на код.
Правда dzhariy зря написал «И тут не используются символические ссылки», т.к. метод can возвращает как раз ссылку на код.
НЛО прилетело и опубликовало эту надпись здесь
$some_sub_link->();
Так тут идёт вызов метода, а не функции.
А can возвращает такую же ссылку, как и \&
А вообще-то в подобной задаче, на мой взгляд, лучше использовать хеш
Так тут идёт вызов метода, а не функции.
А can возвращает такую же ссылку, как и \&
sub hello_world { print "hello_world\n"; } my $some_sub_link1 = main->can("hello_world"); &$some_sub_link1; my $some_sub_link2 = \&hello_world; &$some_sub_link2;
А вообще-то в подобной задаче, на мой взгляд, лучше использовать хеш
my %allow_subs = ( hello_world => \&hello_world, H => \&hello_world, bla_bla => \&bla_bla, B => \&bla_bla, combo1 => sub { hello_world(); hello_world(); bla_bla(); }, ); my $user_cmd = 'combo1'; #if ( my $user_cmd = shift @ARGV ) if ( $user_cmd ) { if ( my $sub = $allow_subs{$user_cmd} ) { &$sub; } else { warn "Unknown command [$user_cmd]"; } }
Если не нужно применять таблицу диспатчинга, то проще сделать вот:
my $sub = __PACKAGE__->can(shift) || die; $sub->();
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Вызов пользовательской функции в Perl из переменной