Какие символы разрешены в идентификаторах Perl? - PullRequest
10 голосов
/ 26 января 2011

Я работаю над домашней работой по регулярным выражениям, где один вопрос:

Использование онлайн-справочников по языку позволяет определить регулярные выражения для целочисленных числовых констант и идентификаторы для Java, Python, Perl и C.

Мне не нужна помощь по регулярному выражению, я просто не знаю, как выглядят идентификаторы в Perl.Я нашел страницы, описывающие допустимые идентификаторы для C , Python и Java , но я не могу найти ничего о Perl.

РЕДАКТИРОВАТЬ: Впоясните, что поиск документации должен был быть легким (например, поиск в Google по идентификаторам python ).Я не посещаю занятия по "поиску в Google".

Ответы [ 4 ]

30 голосов
/ 26 января 2011

Целочисленные константы Perl

Целочисленные константы в Perl могут быть

  • в базе 16, если они начинаются с ^0x
  • в базе 2, если они начинаются с ^0b
  • в базе 8, если они начинаются с 0
  • в противном случае они находятся в базе 10.

После этого лидера указывается любое количество действительных цифр в этой базе , а также необязательные подчеркивания .

Обратите внимание, что цифра не означает \p{POSIX_Digit}; это означает \p{Decimal_Number}, что на самом деле совсем другое, вы знаете.

Обратите внимание, что любой ведущий знак минус является , а не частью целочисленной константы, что легко подтверждается:

$ perl -MO=Concise,-exec -le '$x = -3**$y'
1  <0> enter 
2  <;> nextstate(main 1 -e:1) v:{
3  <$> const(IV 3) s
4  <$> gvsv(*y) s
5  <2> pow[t1] sK/2
6  <1> negate[t2] sK/1
7  <$> gvsv(*x) s
8  <2> sassign vKS/2
9  <@> leave[1 ref] vKP/REFC
-e syntax OK

См. 3 const, а намного позже оп-код negate? Это говорит вам кучу, включая любопытство старшинства.

Идентификаторы Perl

Идентификаторы, указанные с помощью символической разыменования, не имеют абсолютно никаких ограничений на свои имена.

  • Например, 100->(200) вызывает функцию с именем 100 с arugments (100, 200).
  • Для другого ${"What’s up, doc?"} относится к переменной скалярного пакета с этим именем в текущем пакете.
  • С другой стороны, ${"What's up, doc?"} относится к переменной скалярного пакета, имя которой ${"s up, doc?"} и которая не в текущем пакете, а скорее в пакете What. Ну, конечно, если текущий пакет не является пакетом What. Similary $Who's - это переменная $s в пакете Who.

Можно также иметь идентификаторы вида ${^ идентификатор }; они не считаются символическими разыменованиями в таблице символов.

Идентификаторы, содержащие только один символ, могут быть символом пунктуации, включая $$ или %!.

Идентификаторы также могут иметь форму $^C, которая является либо контрольным символом, либо огибающим, сопровождаемым неконтролирующим символом.

Если ни одна из этих вещей не соответствует действительности, (не полностью) идентификатор следует правилам Юникода, связанным с символами со свойствами ID_Start, за которыми следуют те, у которых есть свойство ID_Continue. Тем не менее, это отменяет это, позволяя полностью цифровым идентификаторам и идентификаторам, которые начинаются с (и, возможно, не имеют ничего кроме) подчеркивания. Как правило, вы можете притвориться (но на самом деле это только притворство), что все равно, что сказать \w+, где \w соответствует описанию в Приложении C UTS # 18 . То есть все, что имеет какой-либо из них:

  • Алфавитное свойство - которое включает в себя гораздо больше, чем просто буквы; он также содержит различные комбинирующие символы и кодовые точки Letter_Number, а также буквы в кружке
  • свойство Decimal_Number, которое представляет собой нечто большее, чем просто [0-9]
  • Любые и все символы со свойством Mark, а не только те, которые считаются Other_Alphabetic
  • Любые символы со свойством Connector_Puncutation, подчеркивание которых является лишь одним из них.

Так что либо ^\d+$, либо еще

^[\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}]+$

следует сделать это для действительно простых, если вы не хотите исследовать тонкости свойств Unicode ID_Start и ID_Continue. Вот как это действительно делается, но держу пари, твой инструктор этого не знает. Возможно, один не скажет ему, а?

Но вы должны охватить непростые, которые я описал ранее.

И мы еще не говорили о пакетах.

Пакеты Perl в идентификаторах

Помимо этих простых правил, вы также должны учитывать, что идентификаторы могут быть дополнены именем пакета, а сами имена пакетов следуют правилам идентификаторов.

Разделитель пакетов либо ::, либо ' по вашему желанию.

Ты не чОбязательно укажите пакет, если он является первым компонентом в полностью определенном идентификаторе, и в этом случае это означает пакет main. Это означает, что такие вещи, как $::foo и $'foo эквивалентны $main::foo, а isn't_it() эквивалентны isn::t_it(). (опечатка удалена)

Наконец, в качестве особого случая разрешается использовать завершающую двойную двоеточие (но не одиночную кавычку) в конце хэша, и это затем относится к таблице символов с таким именем.

Таким образом, %main:: является таблицей символов main, и, поскольку вы можете опустить main, также будет %::.

Между тем %foo:: - это таблица символов foo, как и %main::foo::, а также %::foo:: только для извращенности.

Резюме

Приятно видеть, как инструкторы дают людям нетривиальные задания. Вопрос в том, понял ли инструктор, что это нетривиально. Возможно нет.

И вряд ли это просто Perl. Что касается идентификаторов Java, вы уже поняли, что учебники лгут? Вот демо:

$ perl -le 'print qq(public class escape { public static void main(String argv[]) { String var_\033 = "i am escape: ^\033"; System.out.println(var_\033); }})' > escape.java
$ javac escape.java
$ java escape | cat -v
i am escape: ^[

Да, это правда. Это также верно для многих других кодов, особенно если вы используете -encoding UTF-8 в строке компиляции. Ваша задача - найти шаблон, который описывает эти поразительно незапрещенные идентификаторы Java. Подсказка: обязательно включите кодовую точку U + 0000.

А разве вы не рады, что спросили? Надеюсь это поможет. Или что-то. ☺

5 голосов
/ 26 января 2011

Домашнее задание требует, чтобы вы использовали справочные руководства, поэтому я отвечу в этих терминах.

Документация Perl доступна по адресу http://perldoc.perl.org/. Раздел, посвященный переменным, - это perldata.Это легко даст вам полезный ответ.

На самом деле, я сомневаюсь, что полный ответ доступен в документации.Существуют специальные переменные (см. Perlvar) и «используйте utf8;»может сильно повлиять на определение «буквы» и «числа».

$ perl -E'use utf8; $é=123; say $é'
123

[Я охватил только часть идентификатора.Я только заметил, что вопрос больше, чем это]

5 голосов
/ 26 января 2011

Страница perlvar документации по Perl имеет раздел в конце, примерно обрисовывающий допустимый синтаксис.В итоге:

  1. Любая комбинация букв, цифр, подчеркивания и специальной последовательности :: (или '), при условии, что она начинается с буквы или подчеркивания.
  2. Последовательность цифр.
  3. Одиночный знак пунктуации.
  4. Одиночный управляющий символ, который также может быть записан в виде символа-буквы, например ^W.
  5. Буквенно-цифровая строка, начинающаяся с управляющего символа.

Обратите внимание, что большинству идентификаторов, кроме идентификаторов в наборе 1, либо дано специальное значение Perl, либо они зарезервированы и могут получить особое значение вболее поздние версии.Но если вы просто пытаетесь определить, что является допустимым идентификатором, то это не имеет значения в вашем случае.

1 голос
/ 26 января 2011

Не имея официальной спецификации (Perl - это то, что интерпретатор Perl может анализировать), это может быть немного сложно различить.

На этой странице приведены примеры всех форматов целочисленных констант. Формат идентификаторов должен быть выведен из различных страниц в perldoc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...