Целочисленные константы 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.
А разве вы не рады, что спросили? Надеюсь это поможет. Или что-то. ☺