Perl question
-
- Уже с Приветом
- Posts: 19935
- 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: 19935
- Joined: 30 Aug 2000 09:01
- Location: WA
-
- Уже с Приветом
- Posts: 19935
- 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
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
-
- Уже с Приветом
- Posts: 19935
- Joined: 30 Aug 2000 09:01
- Location: WA
Re: Perl question
slozovsk wrote:Это вам не LISP. В LISP-е можно залезть в свойства переменной (атома).
Ну залезете Вы в свойства переменной типа строки, чем это поможет?
Удачи!
-
- Уже с Приветом
- Posts: 19935
- Joined: 30 Aug 2000 09:01
- Location: WA
Palych wrote:Я в таких случаях применяю правило:
Если в данной системе ето сделать геморройно - значит мне ето не надо.
Ну очень хочется...
![Smile :)](./images/smilies/icon_smile.gif)
просто сделал я парсер на perl, в котором в т.ч. можно пользоваться функциями определенными как пользователем (проверить эти имена проблем нет), так и встроенными функциями perl. Хотелось бы отловить опечатки пользователя на этапе компиляции, а не исполнения.
Воспользоваться правилом "не больно-то и хотелось", конечно, никогда не поздно. (так оно сейчас и работает
![Smile :)](./images/smilies/icon_smile.gif)
Удачи!
-
- Уже с Приветом
- 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: 13722
- 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