Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Валидация имени переменной PERL 
:(
    Опции темы
comhunt
Дата 6.3.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



Через переменную $varname поступает имя переменной. Далее необходимо обратиться к значению самой переменной $$varname. Но перед этим надо сделать валидацию корректности всех символов внутри $varname на предмет допустимых для написания переменной в PERL.

Как это можно сделать универсально при помощи одного или нескольких регулярных выражений?

В принципе интересен частный случай когда переменная только скалярная и общий когда это может быть и скаляр и @ % или typeglob

Это сообщение отредактировал(а) comhunt - 6.3.2010, 14:21
PM MAIL   Вверх
dva300
Дата 7.3.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата(comhunt @ 6.3.2010,  14:16)
Через переменную $varname поступает имя переменной. Далее необходимо обратиться к значению самой переменной $$varname. Но перед этим надо сделать валидацию корректности всех символов внутри $varname на предмет допустимых для написания переменной в PERL.

Как это можно сделать универсально при помощи одного или нескольких регулярных выражений?

В принципе интересен частный случай когда переменная только скалярная и общий когда это может быть и скаляр и @ % или typeglob

Код

$var1 = '$_erwer3_';
$var2 = \$var1;
if ($$var2 =~/^\$+(\D+)([A-Z,a-z]+\d*\_*)+$/)
    {
    print "OK! ($$var2)\n";
    }
else
    {
    print "Error! ($$var2)\n";
    }    


как вариант

Правильный скаляр : $x, $strName, $y1, $_name
Не правильный скаляр : yyy, $1y, $_1

Это сообщение отредактировал(а) dva300 - 7.3.2010, 14:51
--------------------
Участник движения Культура Вождения
PM   Вверх
comhunt
Дата 7.3.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



А почему там стоит буква Я ? а буква А- латинская. Разве имена переменных в PERL могут быть написаны русскими буквами?

А какую максимальную длину может иметь имя переменной в PERL ? Интерпретатор PERL это как-то ограничивает?

Это сообщение отредактировал(а) comhunt - 7.3.2010, 14:16
PM MAIL   Вверх
dva300
Дата 7.3.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата(comhunt @ 7.3.2010,  13:56)
А почему там стоит буква Я ? а буква А- латинская. Разве имена переменных в PERL могут быть написаны русскими буквами?

А какую максимальную длину может иметь имя переменной в PERL ? Интерпретатор PERL это как-то ограничивает?

это я ошибся  smile там болжно быть A-Z
length для получения длины длины. 
--------------------
Участник движения Культура Вождения
PM   Вверх
comhunt
Дата 7.3.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



dva300, спасибо. теперь все корректно работает smile
Ну на счет длины я догадывался как определить ее - при помощи функции length.

Но на самом деле интересует принципиально другой вопрос. А что делать с этой длинной? С каким максимальным значением ее сравнивать? И есть ли оно в PERL для имени переменной?
PM MAIL   Вверх
DurRandir
Дата 7.3.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Вам надо прочитать про хеши. И никогда-никогда не делать то, чем вы сейчас пытаетесь заняться. По многим причинам. Прочитайте про use strict, про лексические перменные (my).

PS: Это неверное регулярное выражение. 
PM   Вверх
dva300
Дата 7.3.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата(DurRandir @ 7.3.2010,  14:44)
Вам надо прочитать про хеши. И никогда-никогда не делать то, чем вы сейчас пытаетесь заняться. По многим причинам. Прочитайте про use strict, про лексические перменные (my).

PS: Это неверное регулярное выражение.

стало очень интересно почему это "никогда-никогда" и по каким это "многим причинам". надеюсь это не военная тайна 
и как мне прикрутить my к решению выше описанной задачи ?

 smile 
--------------------
Участник движения Культура Вождения
PM   Вверх
DurRandir
Дата 7.3.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



my здесь при том, что он создаёт лексические переменные, доступ к которым ч/з $$ не получить. А в нормальной программе (при использовании strict) почти все переменные - лексические. Пакетные переменные, в большинстве случаев, - пережиток прошлых perl'ов.

Никогда-никогда - потому что вы не знаете, что вам придёт в качестве имени переменной. Вы пытаетесь проверить её только на синтаксическую, но не семантическую валидность - вам просто возьмут, и перезапишут какую-либо внутреннюю переменную модуля (или у вас даже не модуль, а монолитный скрипт?))).

Решать задачу надо через хеш - вместо имён переменных - ключи хэша, в этом случае эти значения никуда "вовне" не утекут.
PM   Вверх
RomanCh
Дата 8.3.2010, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



В общем и целом согласен с предыдущим оратором - автору топика хочется чего-то странного, такого какого делать не нужно ни при каких условиях.

Но всё же, если вам хочется что-нибудь "эдакого" (откровенно говоря - извращений smile ), то могу предложить вот такой вариант:
Код

no warnings;
if (eval("my \$$varname = 1"))
{
    print "Ok\n";
}
else
{
    print "Invalid\n";
}
use warnings;


PS use warnings выключаются что бы в stderr не плевалось всякое непотребство, если например пришли кавычки в имене переменной. Вообще же сильно рекомендую всегда использовать эту директиву.

PSPS Вообще при некоторых камланиях perl вроде как можно научить понимать идентификаторы написанные буквами отличными от латинских (юникодом если), только что-то не уверен что кто-нибудь захочет такое видеть в чужом (и своём тоже) коде.
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.