perl中的第一类实体和第二类实体之间有什么区别?

Sea*_*ean 9 perl

什么是"一流实体"的定义,它与"二等实体"有何不同?

当用qr //运算符创建"正则表达式是现代perl中的一流实体"时,这意味着什么(取自Modern Perl:the book).

amo*_*mon 11

正如MeNoMore所说,第一类实体是您可以自由分配给变量等的语言的数据类型.在Perl中,这些包括:

  • 标量
  • 数组
  • 哈希
  • Coderefs(例如匿名子程序)
  • IO
  • Typeglobs(符号表是globs的哈希)
  • 格式

那些可以驻留在符号表中.标量槽还可以被各种其他类型占用:

  • 签名整数
  • 无符号整数
  • 浮点数字
  • 字符串
  • 参考
  • 正则表达式

一些实体已经内置到构造塔语言:数字和字符串标量,列表表示对数组和哈希,[]以及{}匿名基于阵列和hashrefs,该sub代码关键字,则open对IO对象的功能,format为内置格式,引用的引用运算符和正则qr{}表达式的运算符.

Perl中的语言结构不是第一类实体,不能分配给标量或其他第一类实体.例如,包.此代码不起作用:

my $anonymous_package = package { ... };  # XXX
Run Code Online (Sandbox Code Playgroud)

Shell命令有自己的内置,但没有数据对象,所以这不起作用:

# don't execute `yes`, but store a handle to it in reference
my $shell_command = \qx{yes};
Run Code Online (Sandbox Code Playgroud)

相反,这个陈述不应该终止(并且可能会破坏你的记忆).

Perl中的列表是语言构造,但没有数据类型:

my $listref = \($x, $y, $z); # assigns reference to $z instead
Run Code Online (Sandbox Code Playgroud)

Perl中的内置类型可以有强制规则:

  • 数字和字符串来回强制.
  • 列表上下文中的单个标量是arity 1的列表.
  • 标量上下文中的数组计算为数组的长度
  • 可以将(甚至有价值的)数组分配给散列
  • 可以将哈希分配给数组,以便将此数组分配给另一个哈希将重新创建相同的哈希
  • 标量上下文中的哈希值评估为(a)如果为空的假值或(b)指示填充和分配的桶的数量的字符串,1/8或(c)数值上下文中的键的数量.
  • 字符串上下文中的正则表达式计算为一个模式字符串,其行为类似于它们指定的模式字符串:qr(ab?c) eq "(?-xism:ab?c)",具体取决于perl的版本.

可以重载对象以通过重载显示类似的强制规则.

在regex-refs的情况下,包含这样的引用的标量可以与正则表达式文字互换使用,例如在模式中

$string =~ /ab?c/
Run Code Online (Sandbox Code Playgroud)

$regex如果$regex如上所述,可以替换正则表达式:

my $regex = qr/ab?c/;
$string =~ $regex ### no dereferencing syntax!
# $string =~ /$regex/ will work too, but may invoke string overloading first (?)
Run Code Online (Sandbox Code Playgroud)

例如,coderefs需要更多的biolerplate代码:

sub foo {...}
foo();
Run Code Online (Sandbox Code Playgroud)

my $foo = sub {...};
$foo->();  # two possibilities
&$foo();
Run Code Online (Sandbox Code Playgroud)

  • 精湛的答案.完全回答并进一步澄清.谢谢. (2认同)