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
(100, 200)
- 別の例で
${"What’s up, doc?"}
は、現在のパッケージ内のその名前でスカラー パッケージ変数を参照します。
- 一方、名前がであり、現在のパッケージではなく
${"What's up, doc?"}
パッケージ内にあるスカラー パッケージ変数を参照します。もちろん、現在のパッケージがパッケージでない限り。同様に、パッケージ内の変数です。${"s up, doc?"}
What
What
$Who's
$s
Who
identifier という形式の${^
識別子}
を持つこともできます。これらは、シンボル テーブルへのシンボリック逆参照とは見なされません。
1 文字だけの識別子は、句読点、インクルード、$$
または%!
.
$^C
識別子は、制御文字またはサーカムフレックスの後に非制御文字が続く という形式にすることもできます。
これらのいずれにも当てはまらない場合、(完全修飾されていない) 識別子は、プロパティを持つ文字に関連する Unicode 規則に従い、その後にプロパティを持つ文字がID_Start
続きますID_Continue
。ただし、すべて数字の識別子と、アンダースコアで始まる (おそらくそれ以外に何もない) 識別子を許可することで、これを無効にします。あなたは一般に、それは UTS#18 の附属書 C に記述されているよう\w+
に、 where isと言っているようなふりをすることができます (しかし、実際にはふりをしているだけです) 。つまり、次のいずれかを持つものです。\w
- Alphabetic プロパティ — 文字だけではありません。また、さまざまな結合文字と Letter_Number コード ポイントに加えて、丸で囲まれた文字も含まれています。
- Decimal_Number プロパティは、単なるものではありません
[0-9]
- Other_Alphabetic と見なされるマークだけでなく、Mark プロパティを持つすべての文字
- Connector_Puncutation プロパティを持つ任意の文字。アンダースコアはその 1 つにすぎません。
だからどちら^\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 を必ず含めてください。
ほら、聞いてよかったと思わない?お役に立てれば。か何か。☺</p>