Pull to refresh

Comments 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/) — прокачивает теорию на начальном уровне.
О, спасибо что напомнили

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

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

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

Перечитаю опять.
UFO just landed and posted this here
Очень красивый способ, т.к. идёт ещё и проверка на существование данной функции.

Правда dzhariy зря написал «И тут не используются символические ссылки», т.к. метод can возвращает как раз ссылку на код.
UFO just landed and posted this here
$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]";
    }
}
UFO just landed and posted this here
Если не нужно применять таблицу диспатчинга, то проще сделать вот:
my $sub = __PACKAGE__->can(shift) || die;
$sub->();
Sign up to leave a comment.

Articles