Perl question

uncle_Pasha
Уже с Приветом
Posts: 19935
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: 19935
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))
...
Max
Уже с Приветом
Posts: 359
Joined: 20 Jan 1999 10:01
Location: Seattle, Washington, USA

Re: Perl question

Post by Max »

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

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

Удачи!



sub mytst1 {

}

sub isDefined {
defined(*{$_[0]});
}

if (isDefined('mytst1')) {
print "mytst1 defined\n";
} else {
print "mytst1 is not defined\n";
}
if (isDefined('mytst2')) {
print "mytst2 defined\n";
} else {
print "mytst2 is not defined\n";
}


Результат выполнения:

C:\Perl\eg>perl example.pl
mytst1 defined
mytst2 is not defined

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

Re: Perl question

Post by uncle_Pasha »

Max wrote:Результат выполнения:

C:\Perl\eg>perl example.pl
mytst1 defined
mytst2 is not defined

C:\Perl\eg>


Неужели Perl действительно только для писателей? :)
Это не пройдет, к примеру, с print, substr, etc,

Удачи!

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