Perl question

uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Perl question

Post by uncle_Pasha »

М.б. кто подскажет?

Как мне узнать, определена ли функция, скажем 'f' в текущем контексте, без попытки ее вызова?
т.е. имя сплавляется как переменная, хотелось бы получить ответ - есть такая функция или нет... спасибо.

Удачи!
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Post by Palych »

if (defined($$f)) ???
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Re: Perl question

Post by f_evgeny »

uncle_Pasha wrote:М.б. кто подскажет?

Как мне узнать, определена ли функция, скажем 'f' в текущем контексте, без попытки ее вызова?
т.е. имя сплавляется как переменная, хотелось бы получить ответ - есть такая функция или нет... спасибо.

Удачи!


#! /usr/bin/perl -w

$sub_name = "my_sub";

if(defined(&$sub_name)) {
print "defined\n";
}else{
print "not defined\n";
}

sub my_sub {
return(1);
}
Дальше, все будет только хуже. Оптимист.
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

Palych wrote:if (defined($$f)) ???


Он всегда не defined
Удачи!
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Re: Perl question

Post by uncle_Pasha »

f_evgeny wrote:#! /usr/bin/perl -w

$sub_name = "my_sub";

if(defined(&$sub_name)) {
print "defined\n";
}else{
print "not defined\n";
}

sub my_sub {
return(1);
}


Теперь пишем:
$sub_name = 'substr';

получаем:
not defined

Удачи!
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Re: Perl question

Post by slozovsk »

Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Post by Palych »

Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.
Попытки обойти ограничания, наставить костыли и т.д. как правило ни к чему хорошему не приводят...
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Re: Perl question

Post by uncle_Pasha »

slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).


Ну залезете Вы в свойства переменной типа строки, чем это поможет?

Удачи!
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

Palych wrote:Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.


Ну очень хочется... :)
просто сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl. Хотелось бы отловить опечатки пользователя на этапе компиляции, а не исполнения.
Воспользоваться правилом "не больно-то и хотелось", конечно, никогда не поздно. (так оно сейчас и работает :) )

Удачи!
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

uncle_Pasha wrote:
Palych wrote:Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.


Ну очень хочется... :)
просто сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl. Хотелось бы отловить опечатки пользователя на этапе компиляции, а не исполнения.
Воспользоваться правилом "не больно-то и хотелось", конечно, никогда не поздно. (так оно сейчас и работает :) )

Удачи!

1. "Против лома нет приема" - самому набить список ключевых слов.
2. Может не совсем то. Но тоже ничего. Воспользоваться функцией AUTOLOAD для перехвата ошибок.
Дальше, все будет только хуже. Оптимист.
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Re: Perl question

Post by slozovsk »

uncle_Pasha wrote:
slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).


Ну залезете Вы в свойства переменной типа строки, чем это поможет?

Удачи!


А тем, что это означает доступность всех мета-данных (включая и текст подпрограммы). Т.е. раз LISP интерпретатор может понять, что это функция и вычислить ее значение, значит и программа может сделать то же самое, поскольку имеет доступ к тем же самым мета-данным. Может даже проанализировать текст функции, если надо - вся информация есть.

Вот один из примеров - http://www.slac.stanford.edu/comp/unix/ ... tml#SEC149
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Post by Palych »

Perl vrode Object Oriented?
Chto ezhali nabit' takuyu tablichku:

%cmap{"doThis"} = new DoThisCommand(); // tochnyj syntaxis ne znayu
%cmap{"doThat"} = new DoThatCommand();

I vyzyvat':

$command = $cmap{$commandString};
$command.doIt();

Pri etom:

class Command {
doIt() {}
}

class DoThisCommand extends Command {
doIt() {
.... // implementation
}
}
...
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Post by slozovsk »

Palych wrote:Perl vrode Object Oriented?
Chto ezhali nabit' takuyu tablichku:

%cmap{"doThis"} = new DoThisCommand(); // tochnyj syntaxis ne znayu
%cmap{"doThat"} = new DoThatCommand();

I vyzyvat':

$command = $cmap{$commandString};
$command.doIt();

Pri etom:

class Command {
doIt() {}
}

class DoThisCommand extends Command {
doIt() {
.... // implementation
}
}
...


Ну, без всякой объектно ориентированности можно функции загнать в хеш.

$functions{'f1'} = sub {...};

Но это работает только для своих функций, да и морока.

Посмотрел я что возращает ref(\&substr11111) - выдает, что подпрограмма (хотя substr11111 и не определена).

Автору топика:

Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

<перлчайник_on>
а можно попробовать взять reference
$subref=\&name
и что-то дальше сделать? (ну, на тип проверить...что ли)

<перлчайник_on_все_так_же>
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Post by slozovsk »

Sergey___K wrote:<перлчайник_on>
а можно попробовать взять reference
$subref=\&name
и что-то дальше сделать? (ну, на тип проверить...что ли)

<перлчайник_on_все_так_же>


А я что сделал в предыдущем посте? :-) ref(\&substr11111)

Return to “Вопросы и новости IT”