Как стать автором
Обновить

Комментарии 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.
Приведенный мной пример работает с use strict, если читать что именно вы копируете в исполнение.
чорт
простите, не заметил, куда вы отвечаете
И тем не менее, в нужном месте лучше просто добавить блок с «no strict 'refs';», ведь это не возможная ошибка, а как раз цель.
согласен — блок с но стрикт даст визуальный акцент при просмотре кода.
Ну если бы Вы немножко почитали о литералах Перла, проблем с написанием такого не возникло бы.
Не могли бы Вы дать ссылку на мануал? А то, боюсь, не то могу найти.

А так — охватить всё сразу невозможно) Задачи решаются по мере их поступлений, и по ходу дела уже роется гугл и мануалы. Но вот в данном примере я немного растерялся — в какой именно мануал рыть.
По сабжу топика вот (http://www.intuit.ru/department/pl/perl/11/6.html) читайте про символические ссылки.
А вообще всем своим программистам, которые не знакомы с перлом, я говорю пройти этот курс www.intuit.ru/department/pl/perl/) — прокачивает теорию на начальном уровне.
О, спасибо что напомнили

Символическими ссылками-то я активно пользуюсь, но не знал раньше (ниже написано), что с сабами можно так.

Я собственно перл и начал фактически учить с этой книжки — у меня на бумаге есть

Просто традиционно читал «между строк» — надо было скорее приступать к работе уже с ним)

Перечитаю опять.
НЛО прилетело и опубликовало эту надпись здесь
Очень красивый способ, т.к. идёт ещё и проверка на существование данной функции.

Правда dzhariy зря написал «И тут не используются символические ссылки», т.к. метод can возвращает как раз ссылку на код.
НЛО прилетело и опубликовало эту надпись здесь
$some_sub_link->();
Так тут идёт вызов метода, а не функции.
А 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->();
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории