Perl question
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
Perl question
М.б. кто подскажет?
Как мне узнать, определена ли функция, скажем 'f' в текущем контексте, без попытки ее вызова?
т.е. имя сплавляется как переменная, хотелось бы получить ответ - есть такая функция или нет... спасибо.
Удачи!
Как мне узнать, определена ли функция, скажем 'f' в текущем контексте, без попытки ее вызова?
т.е. имя сплавляется как переменная, хотелось бы получить ответ - есть такая функция или нет... спасибо.
Удачи!
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK
Re: Perl question
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);
}
Дальше, все будет только хуже. Оптимист.
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
Re: Perl question
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
Удачи!
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
Re: Perl question
Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
-
- Уже с Приветом
- Posts: 13683
- Joined: 16 Jan 2001 10:01
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
Re: Perl question
slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
Ну залезете Вы в свойства переменной типа строки, чем это поможет?
Удачи!
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
Palych wrote:Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.
Ну очень хочется...
просто сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl. Хотелось бы отловить опечатки пользователя на этапе компиляции, а не исполнения.
Воспользоваться правилом "не больно-то и хотелось", конечно, никогда не поздно. (так оно сейчас и работает )
Удачи!
-
- Уже с Приветом
- Posts: 10367
- Joined: 12 Apr 2001 09:01
- Location: Lithuania/UK
uncle_Pasha wrote:Palych wrote:Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.
Ну очень хочется...
просто сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl. Хотелось бы отловить опечатки пользователя на этапе компиляции, а не исполнения.
Воспользоваться правилом "не больно-то и хотелось", конечно, никогда не поздно. (так оно сейчас и работает )
Удачи!
1. "Против лома нет приема" - самому набить список ключевых слов.
2. Может не совсем то. Но тоже ничего. Воспользоваться функцией AUTOLOAD для перехвата ошибок.
Дальше, все будет только хуже. Оптимист.
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
Re: Perl question
uncle_Pasha wrote:slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
Ну залезете Вы в свойства переменной типа строки, чем это поможет?
Удачи!
А тем, что это означает доступность всех мета-данных (включая и текст подпрограммы). Т.е. раз LISP интерпретатор может понять, что это функция и вычислить ее значение, значит и программа может сделать то же самое, поскольку имеет доступ к тем же самым мета-данным. Может даже проанализировать текст функции, если надо - вся информация есть.
Вот один из примеров - http://www.slac.stanford.edu/comp/unix/ ... tml#SEC149
-
- Уже с Приветом
- Posts: 13683
- Joined: 16 Jan 2001 10:01
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
}
}
...
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
}
}
...
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
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 и не определена).
Автору топика:
Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
slozovsk wrote:Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?
Дык, сказал же вроде...
Есть парсер некого простого языка написанного на перл, который позволяет дергать API системы, использовать определяемые пользователем и встроенные в Perl функции, которые принимают скалярные параметры (количество которых к моменту проверки известно) и от которых ожидается возвращаемое значение - скаляр.
Хотелость бы отсечь опечатки пользователя на этапе компиляции текста программы на этом простом языке.
Никаких других средств, кроме самого перла использовать нет возможности..
Удачи!
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
uncle_Pasha wrote:slozovsk wrote:Тут уже высказывалось мнение, что если чего-то в языке сделать нельзя, то вероятнее всего, оно вам и не надо. Может имеет смысл поделиться, для чего вам это надо?
Дык, сказал же вроде...
Есть парсер некого простого языка написанного на перл, который позволяет дергать API системы, использовать определяемые пользователем и встроенные в Perl функции, которые принимают скалярные параметры (количество которых к моменту проверки известно) и от которых ожидается возвращаемое значение - скаляр.
Хотелость бы отсечь опечатки пользователя на этапе компиляции текста программы на этом простом языке.
Никаких других средств, кроме самого перла использовать нет возможности..
Удачи!
В самом Перле функций немного - явно вбиваем их названия - в хеш или куда надо. Все имена новых функциий определяемых пользователем на вашем языке - парсер (интерпретатор) добавляет туда же.
-
- Уже с Приветом
- Posts: 19924
- Joined: 30 Aug 2000 09:01
- Location: WA
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
uncle_Pasha wrote:slozovsk wrote:В самом Перле функций немного - явно вбиваем их названия - в хеш или куда надо.
Похоже, все к этому и идет...
Удачи!
Если не надо цеплять внешних пакетов - то и говорить не о чем. Вот я только сегодня оновлял список syscalls к ядру Линукс. Таблица из 200 или около того названий и описания параметров. Ну, пришлось руками поработать Не все ж головой только
Могу идею подкинуть - берем список функций из документации - из странички удалем весь текст - оставляем названия функций
Я свою таблицу делал похожим образом - только список выдрал из ассемблерного исходника. (мне еще и порядок следования функций в таблице важен).
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
-
- Уже с Приветом
- Posts: 750
- Joined: 10 Dec 2003 20:11
Code: Select all
$sub_name = 'abc1';
if (exists ::->{$sub_name}) {
print "Defined.\n";
} else {
print "Not defined.\n";
}
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
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:~ >
-
- Уже с Приветом
- Posts: 750
- Joined: 10 Dec 2003 20:11
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.
-
- Уже с Приветом
- Posts: 13080
- Joined: 14 Sep 2001 09:01
- Location: Odessa, Ukraine -> Santa Clara, CA
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:~ >
-
- Уже с Приветом
- Posts: 630
- Joined: 01 May 2001 09:01
- Location: Москва -> New York
Re: Perl question
uncle_Pasha wrote:slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
Ну залезете Вы в свойства переменной типа строки, чем это поможет?
Никуда не надо залезать:
(if (symbol-function (make-symbol mystr))
...