Search
Write a publication
Pull to refresh
0
0
GreenFactory @GreenFactory

User

Send message
$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]";
    }
}
Очень красивый способ, т.к. идёт ещё и проверка на существование данной функции.

Правда dzhariy зря написал «И тут не используются символические ссылки», т.к. метод can возвращает как раз ссылку на код.
1. это не $DEBUG , а
sub DEBUG {1} # или sub DEBUG {0}
хотя, конечно же $DEBUG так же подойдёт.
2. лично мне кажется, что строка начинающаяся со слова "DEBUG" самая понятная для обозначения отладки.
3. Т.к. я всегда пишу IF одним и тем же способом, такая запись экономит лично мне 2 строки и часть символов
4. Да, это слегка сложнее для понимания, т.к. эта запись не стандартизирована, хотя и является полным аналогом IF(){}
P.S. IF я пиши так:
if(DEBUG)
{
    warn "i=$i";
}
Документация на русском... Блеск!
Благодарю, тема действительно актуальна.
Это программа, которая выводит вращающуюся спираль, своим исходным кодом
Есть ещё такой вариант, скорость такая же, как при if (DEBUG) , а читабельность выше.

use constant DEBUG => 0;
DEBUG && warn "i=$i";

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity