「ファーストクラスのエンティティ」という言葉によって定義されるものと、「ファーストクラスのエンティティ」とはどのように異なるのですか?perlのファーストクラスエンティティとセカンドクラスエンティティの違いは何ですか?
「正規表現は、qr //演算子で作成されたときに現代のPerlでファーストクラスのエンティティ」(Modern Perlから取られた本:本)とはどういう意味ですか? Wikipediaから
「ファーストクラスのエンティティ」という言葉によって定義されるものと、「ファーストクラスのエンティティ」とはどのように異なるのですか?perlのファーストクラスエンティティとセカンドクラスエンティティの違いは何ですか?
「正規表現は、qr //演算子で作成されたときに現代のPerlでファーストクラスのエンティティ」(Modern Perlから取られた本:本)とはどういう意味ですか? Wikipediaから
MeNoMoreが正しく言ったように、ファーストクラス・エンティティは、あなたが自由にPerlでなどの変数に割り当てることができる言語のデータ型であり、これらが含まれます:
それらがシンボルテーブルに存在することができる(シンボルテーブルはグロブのハッシュです)。スカラースロットはほかに、様々な他のタイプによって占有することができます。
これらのエンティティの中には、言語に組み込まれたコンストラクタがあります:スカラーの数と文字列リテラル、配列とハッシュのリスト表記、匿名の配列とハッシュリファレンスの場合は[]
と{}
、コードの場合はsub
、IOオブジェクトの場合はopen
関数、format
の組み込み形式、参照の参照演算子、 regexesの演算子は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
組み込み型:
リストは、言語構造、ないデータ型です。
1/8
または(c)数値コンテキストのキー数。qr(ab?c) eq "(?-xism:ab?c)"
で指定されたように動作するパターン文字列に評価されます。オブジェクトはオーバーロードによって同様の強制変換規則を示すようにオーバーロードすることができます。
regex-refsの場合、そのような参照を含むスカラーは正規表現のリテラルと互換的に使用できます。$regex
が上記のようであれば、パターン
$string =~ /ab?c/
に正規表現を$regex
で置き換えることができる:
sub foo {...}
foo();
対:例えば
my $regex = qr/ab?c/;
$string =~ $regex ### no dereferencing syntax!
# $string =~ /$regex/ will work too, but may invoke string overloading first (?)
、コードリファレンスは、よりbiolerplateコードを必要と
my $foo = sub {...};
$foo->(); # two possibilities
&$foo();
:プログラミング言語の設計、第一級オブジェクト(また、 エンティティオブジェクト、または値)で
は、特定のプログラミング 言語の文脈では、することができるエンティティであります実行時に構築され、パラメータが として渡され、サブルーチンから返され、または変数 に代入されます。コンピュータサイエンスでは、 は、何かを作るプロセス(技術、メカニズム)を指している場合には、 ファーストクラスのオブジェクトです。
サブルーチン
にパラメータとして渡すことができる変数およびデータ構造に格納することができる戻すことができる。
オブジェクトは、それが最初のクラスでありますサブルーチンの結果として
実行時に構築することができます
は固有識別(任意の名前の独立した)
用語「オブジェクト」は、必ずしも、オブジェクト指向プログラミングで オブジェクトを参照しない、緩くここで使用されています。最も単純なスカラデータ 型(整数や浮動小数点数など)は、ほとんど常にファーストクラスの です。
のPerl 5.12のためのrelease notesには、次のものがあります。
正規表現は、内部的には
今最初のクラスであり、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
これは「ファーストクラス」が意味するリリースノートです。私は本がamonの定義を使っていると信じています。
素晴らしい回答です。完全に答えられ、さらに明確になりました。ありがとうございました。 – Sean