Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Валидация имени переменной PERL


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

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

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

Автор: dva300 7.3.2010, 11:16
Цитата(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

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

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

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

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

это я ошибся  smile там болжно быть A-Z
length для получения длины длины. 

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

Но на самом деле интересует принципиально другой вопрос. А что делать с этой длинной? С каким максимальным значением ее сравнивать? И есть ли оно в PERL для имени переменной?

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

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

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

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

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

 smile 

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

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

Решать задачу надо через хеш - вместо имён переменных - ключи хэша, в этом случае эти значения никуда "вовне" не утекут.

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

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

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


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

PSPS Вообще при некоторых камланиях perl вроде как можно научить понимать идентификаторы написанные буквами отличными от латинских (юникодом если), только что-то не уверен что кто-нибудь захочет такое видеть в чужом (и своём тоже) коде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)