「一流の実体」とは何を定義し、「二流の実体」とどう違うのですか?
「正規表現は、qr //演算子を使用して作成された場合、現代のPerlのファーストクラスのエンティティである」(現代のPerlから引用:本)とはどういう意味ですか。
「一流の実体」とは何を定義し、「二流の実体」とどう違うのですか?
「正規表現は、qr //演算子を使用して作成された場合、現代のPerlのファーストクラスのエンティティである」(現代のPerlから引用:本)とはどういう意味ですか。
MeNoMoreが正しく言っているように、ファーストクラスエンティティは、変数などに自由に割り当てることができる言語のデータ型です。Perlでは、これらには次のものが含まれます。
それらはシンボルテーブルに常駐できます。スカラースロットは、他のさまざまなタイプで占有できます。
これらのエンティティの一部には、言語に組み込みのコンストラクタがあります。スカラーの数値および文字列リテラル、配列とハッシュのリスト表記、匿名の配列とハッシュ参照、コードの[]
キーワード、IOオブジェクトの関数、フォーマットの組み込み、参照用の参照演算子、およびregexes用の演算子。{}
sub
open
format
qr{}
Perlには、ファーストクラスのエンティティではなく、スカラーやその他のファーストクラスのエンティティに割り当てることができない言語構造があります。たとえば、パッケージ。このコードは機能しません:
my $anonymous_package = package { ... }; # XXX
シェルコマンドには独自の組み込みがありますが、データオブジェクトではないため、これは機能しません。
# don't execute `yes`, but store a handle to it in reference
my $shell_command = \qx{yes};
代わりに、このステートメントは終了しないでください(そしておそらくあなたの記憶を吹き飛ばします)。
Perlのリストは言語構造ですが、データ型はありません。
my $listref = \($x, $y, $z); # assigns reference to $z instead
Perlの組み込み型には、強制ルールを含めることができます。
1/8
または(c)数値コンテキストのキーの数に評価されます。qr(ab?c) eq "(?-xism:ab?c)"
、perlのバージョンに応じて、指定されたものと同じように動作するパターン文字列に評価されます。オブジェクトをオーバーロードして、オーバーロードを通じて同様の強制ルールを表示できます。
正規表現参照の場合、そのような参照を含むスカラーは、たとえばパターンで、正規表現リテラルと交換可能に使用できます。
$string =~ /ab?c/
正規表現は、上記のような$regex
場合に置き換えることができます。$regex
my $regex = qr/ab?c/;
$string =~ $regex ### no dereferencing syntax!
# $string =~ /$regex/ will work too, but may invoke string overloading first (?)
たとえば、coderefにはより多くのbiolerplateコードが必要です。
sub foo {...}
foo();
対
my $foo = sub {...};
$foo->(); # two possibilities
&$foo();
Perl5.12のリリースノートには次のものが含まれます。
正規表現がファーストクラスになりました
内部的には、Perlはコンパイルされた正規表現(qr //で作成されたものなど)をファーストクラスのエンティティとして扱うようになりました。この変更のために、シリアル化、逆シリアル化、またはPerlの内部データ構造との深い相互作用を持つPerlモジュールを更新する必要があります。影響を受けるほとんどのCPANモジュールは、この記事の執筆時点ですでに更新されています。
5.12より前は、正規表現エンジンだけがコンパイルされた正規表現について何も知りませんでした。コンパイルされた正規表現をスカラーに格納すると、コンパイルされた正規表現パターンへのポインターを含むラッパー(への参照)が格納されました。
# 5.10.1
> perl -MDevel::Peek -e"Dump qr/abc/"
SV = RV(0x3be060) at 0x3be050
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x3be0b0
SV = PVMG(0x2bbfd8) at 0x3be0b0 <--- Uses a generic magic scalar
REFCNT = 1
FLAGS = (OBJECT,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x262aa8
MG_VIRTUAL = 0x28199d00
MG_TYPE = PERL_MAGIC_qr(r)
MG_OBJ = 0x2bdd68 <---- Regex is actually stored
PAT = "(?-xism:abc)" outside the scalar.
REFCNT = 2
STASH = 0x3bead0 "Regexp"
5.12以降、整数や文字列と同様に、スカラーの適切なサブタイプになりました。コンパイルされた正規表現をスカラーに格納する場合、コンパイルされた正規表現パターン自体(への参照)を格納します。
# 5.16.1
>perl -MDevel::Peek -e"Dump qr/abc/"
SV = IV(0x74b1b8) at 0x74b1bc
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x74b1cc
SV = REGEXP(0x33b8a4) at 0x74b1cc <--- REGEXP is a subtype of scalar
REFCNT = 1
FLAGS = (OBJECT,POK,FAKE,pPOK)
PV = 0x31f90c "(?^:abc)"
CUR = 8
LEN = 0
STASH = 0x74baec "Regexp"
EXTFLAGS = 0x680000 (CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML)
INTFLAGS = 0x0
NPARENS = 0
LASTPAREN = 0
LASTCLOSEPAREN = 0
MINLEN = 3
MINLENRET = 3
GOFS = 0
PRE_PREFIX = 4
SEEN_EVALS = 0
SUBLEN = 0
SUBBEG = 0x0
ENGINE = 0x280cfac0
MOTHER_RE = 0x328a54
PAREN_NAMES = 0x0
SUBSTRS = 0x326174
PPRIVATE = 0x351c04
OFFS = 0x74343c
これは、リリースノートが「ファーストクラス」によって意味するものです。しかし、この本はアモンの定義を使用していると思います。
ウィキペディアから:
プログラミング言語の設計において、特定のプログラミング言語のコンテキストにおける第一級市民 (オブジェクト、エンティティ、または値も) は、実行時に構築され、パラメーターとして渡され、サブルーチンから返されるエンティティです。 、または変数に割り当てられます。コンピュータ サイエンスでは、具体化という用語は、何かを第一級のオブジェクトにするプロセス (技術、メカニズム) を指すときに使用されます。
次の場合、オブジェクトはファーストクラスです。
変数とデータ構造に格納できます
パラメータとしてサブルーチンに渡すことができます
サブルーチンの結果として返すことができます
実行時に構築可能
固有のアイデンティティを持っている (任意の名前とは無関係)
「オブジェクト」という用語は、ここでは大まかに使用されており、必ずしもオブジェクト指向プログラミングのオブジェクトを指しているわけではありません。整数や浮動小数点数などの最も単純なスカラー データ型は、ほとんどの場合、ファースト クラスです。