Perl question

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

Perl question

Post by uncle_Pasha »

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

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

Удачи!
Palych
Уже с Приветом
Posts: 13682
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: 19924
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

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


Он всегда не defined
Удачи!
uncle_Pasha
Уже с Приветом
Posts: 19924
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: 13682
Joined: 16 Jan 2001 10:01

Post by Palych »

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

Re: Perl question

Post by uncle_Pasha »

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


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

Удачи!
uncle_Pasha
Уже с Приветом
Posts: 19924
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: 13682
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)
uncle_Pasha
Уже с Приветом
Posts: 19924
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

slozovsk wrote:Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?


Дык, сказал же вроде...
Есть парсер некого простого языка написанного на перл, который позволяет дергать API системы, использовать определяемые пользователем и встроенные в Perl функции, которые принимают скалярные параметры (количество которых к моменту проверки известно) и от которых ожидается возвращаемое значение - скаляр.
Хотелость бы отсечь опечатки пользователя на этапе компиляции текста программы на этом простом языке.
Никаких других средств, кроме самого перла использовать нет возможности..

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

Post by slozovsk »

uncle_Pasha wrote:
slozovsk wrote:Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?


Дык, сказал же вроде...
Есть парсер некого простого языка написанного на перл, который позволяет дергать API системы, использовать определяемые пользователем и встроенные в Perl функции, которые принимают скалярные параметры (количество которых к моменту проверки известно) и от которых ожидается возвращаемое значение - скаляр.
Хотелость бы отсечь опечатки пользователя на этапе компиляции текста программы на этом простом языке.
Никаких других средств, кроме самого перла использовать нет возможности..

Удачи!


В самом Перле функций немного - явно вбиваем их названия - в хеш или куда надо. Все имена новых функциий определяемых пользователем на вашем языке - парсер (интерпретатор) добавляет туда же.
uncle_Pasha
Уже с Приветом
Posts: 19924
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

slozovsk wrote:В самом Перле функций немного - явно вбиваем их названия - в хеш или куда надо.

Похоже, все к этому и идет...

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

Post by slozovsk »

uncle_Pasha wrote:
slozovsk wrote:В самом Перле функций немного - явно вбиваем их названия - в хеш или куда надо.

Похоже, все к этому и идет...

Удачи!


Если не надо цеплять внешних пакетов - то и говорить не о чем. Вот я только сегодня оновлял список syscalls к ядру Линукс. Таблица из 200 или около того названий и описания параметров. Ну, пришлось руками поработать :-) Не все ж головой только :-)

Могу идею подкинуть - берем список функций из документации - из странички удалем весь текст - оставляем названия функций :-)

Я свою таблицу делал похожим образом - только список выдрал из ассемблерного исходника. (мне еще и порядок следования функций в таблице важен).
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

А я что сделал в предыдущем посте? ref(\&substr11111)
Так Перл же write-only. :)
Hatih
Уже с Приветом
Posts: 750
Joined: 10 Dec 2003 20:11

Post by Hatih »

Code: Select all

$sub_name = 'abc1';

if (exists ::->{$sub_name}) {
    print "Defined.\n";
} else {
    print "Not defined.\n";
}
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Post by slozovsk »

Hatih wrote:

Code: Select all

$sub_name = 'abc1';

if (exists ::->{$sub_name}) {
    print "Defined.\n";
} else {
    print "Not defined.\n";
}


Распечатка:

serge@targus:~ > perl
$sub_name = 'print';

if (exists ::->{$sub_name}) {
print "Defined.\n";
} else {
print "Not defined.\n";
}
Not defined.
serge@targus:~ >
Hatih
Уже с Приветом
Posts: 750
Joined: 10 Dec 2003 20:11

Post by Hatih »

Code: Select all

sub abc
{
}

$sub_name = 'abc';

if (exists ::->{$sub_name}) {
    print "abc Defined.\n";
} else {
    print "abc Not defined.\n";
}

$sub_name = 'abcxxx';

if (exists ::->{$sub_name}) {
    print "abcxxx Defined.\n";
} else {
    print "abcxxx Not defined.\n";
}


abc Defined.
abcxxx Not defined.
slozovsk
Уже с Приветом
Posts: 13080
Joined: 14 Sep 2001 09:01
Location: Odessa, Ukraine -> Santa Clara, CA

Post by slozovsk »

Hatih wrote:...
abc Defined.
abcxxx Not defined.


Я же привел пример, когда ваш метод не работает. Как я понимаю, автору топика надо в первую очередь определять встроенные функции, с вновь определенными у него проблем нет.

сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl.


Не говоря о том, что нужно определить есть ли такая ФУНКЦИЯ.

serge@targus:~ > perl
$abc = 1;

$sub_name = 'abc';

if (exists ::->{$sub_name}) {
print "abc Defined.\n";
} else {
print "abc Not defined.\n";
}
abc Defined.
serge@targus:~ >
User avatar
zor0n
Уже с Приветом
Posts: 630
Joined: 01 May 2001 09:01
Location: Москва -> New York

Re: Perl question

Post by zor0n »

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


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


Никуда не надо залезать: :umnik1:

(if (symbol-function (make-symbol mystr))
...

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