2012-11-19 19 views
9

「ファーストクラスのエンティティ」という言葉によって定義されるものと、「ファーストクラスのエンティティ」とはどのように異なるのですか?perlのファーストクラスエンティティとセカンドクラスエンティティの違いは何ですか?

「正規表現は、qr //演算子で作成されたときに現代のPerlでファーストクラスのエンティティ」(Modern Perlから取られた本:本)とはどういう意味ですか? Wikipediaから

答えて

11

MeNoMoreが正しく言ったように、ファーストクラス・エンティティは、あなたが自由にPerlでなどの変数に割り当てることができる言語のデータ型であり、これらが含まれます:

  • スカラー
  • 配列
  • ハッシュ
  • コードリファレンス(例えば無名サブルーチン)
  • IO
  • 型グロブは
  • フォーマット

それらがシンボルテーブルに存在することができる(シンボルテーブルはグロブのハッシュです)。スカラースロットはほかに、様々な他のタイプによって占有することができます。

  • 署名付き整数
  • 符号なし整数
  • 浮動小数点数
  • ストリングス
  • 参照
  • 正規表現

これらのエンティティの中には、言語に組み込まれたコンストラクタがあります:スカラーの数と文字列リテラル、配列とハッシュのリスト表記、匿名の配列とハッシュリファレンスの場合は[]{}、コードの場合は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 

組み込み型:

  • 数値と文字列の前後に強制Perlで

    リストは、言語構造、ないデータ型です。

  • リストコンテキストにおける単一のスカラーはアリティのリストである1
  • スカラコンテキストの配列は、配列
  • アン(偶数値)の配列をハッシュ
  • Aに割り当てることができるの長さと評価この配列を別のハッシュに割り当てると同じハッシュが再作成されるように配列にハッシュを割り当てることができます。
  • スカラーコンテキストのハッシュは、(a)空であればfalse値、(b)は数値を示す文字列充填され割り当てられたバケットの例1/8または(c)数値コンテキストのキー数。
  • 文字列コンテキストの正規表現は、perlのバージョンに応じて、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(); 
+2

素晴らしい回答です。完全に答えられ、さらに明確になりました。ありがとうございました。 – Sean

1

:プログラミング言語の設計、第一級オブジェクト(また、 エンティティオブジェクト、または値)で

は、特定のプログラミング 言語の文脈では、することができるエンティティであります実行時に構築され、パラメータが として渡され、サブルーチンから返され、または変数 に代入されます。コンピュータサイエンスでは、 は、何かを作るプロセス(技術、メカニズム)を指している場合には、 ファーストクラスのオブジェクトです。

  • サブルーチン

  • にパラメータとして渡すことができる変数およびデータ構造に格納することができる戻すことができる。

    オブジェクトは、それが最初のクラスでありますサブルーチンの結果として

  • 実行時に構築することができます

  • は固有識別(任意の名前の独立した)

    用語「オブジェクト」は、必ずしも、オブジェクト指向プログラミングで オブジェクトを参照しない、緩くここで使用されています。最も単純なスカラデータ 型(整数や浮動小数点数など)は、ほとんど常にファーストクラスの です。

4

の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の定義を使っていると信じています。

関連する問題