11

私は正規表現の宿題に取り組んでいます.1つの質問は次のとおりです。

オンラインの言語リファレンス マニュアルを使用して、Java、Python、Perl、および C の整数数値定数と識別子の正規表現を決定します。

正規表現のヘルプは必要ありません。Perl で識別子がどのように表示されるかわかりません。CPython、およびJavaの有効な識別子を説明しているページを見つけましたが、Perl については何も見つかりません。

編集: 明確にするために、ドキュメントを見つけるのは簡単になるように意図されていました ( python identifiersの Google 検索を行うように)。私は「Google 検索を行う」クラスを受講していません。

4

4 に答える 4

32

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?"}WhatWhat$Who's$sWho

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::fooisn'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>

于 2011-01-26T01:44:37.600 に答える
5

宿題ではリファレンス マニュアルを使用するように求められているので、その条件で回答します。

Perl のドキュメントはhttp://perldoc.perl.org/で入手できます。変数を扱うセクションは perldata です。これにより、使用可能な答えが簡単に得られます。

実際には、完全な答えがドキュメントにあるとは思えません。特別な変数 (perlvar を参照) と「use utf8;」があります。「文字」と「数字」の定義に大きな影響を与える可能性があります。

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

[識別子の部分だけをカバーしました。質問がそれよりも大きいことに気づきました]

于 2011-01-26T00:18:43.920 に答える
5

Perl ドキュメントの perlvar ページには、許容される構文を大まかに説明するセクションが最後にあります。要約すれば:

  1. 文字またはアンダースコアで始まる場合、文字、数字、アンダースコア、および特殊なシーケンス::(または) の任意の組み合わせ。'
  2. 一連の数字。
  3. 単一の句読点。
  4. キャレット-{文字} としても記述できる単一の制御文字^W
  5. 制御文字で始まる英数字の文字列。

セット 1 以外のほとんどの識別子は、Perl によって特別な意味が与えられているか、予約されており、後のバージョンで特別な意味を持つ可能性があることに注意してください。しかし、何が有効な識別子かを理解しようとしているだけなら、それはあなたの場合にはあまり重要ではありません。

于 2011-01-26T00:19:48.157 に答える
1

公式の仕様がないため (Perl は、perl インタープリターが解析できるものなら何でも)、これらを識別するのは少し難しい場合があります。

このページには、すべての整数定数形式の例があります。識別子の形式は、perldoc のさまざまなページから推測する必要があります。

于 2011-01-26T00:17:46.100 に答える