什么是"一流实体"的定义,它与"二等实体"有何不同?
当用qr //运算符创建"正则表达式是现代perl中的一流实体"时,这意味着什么(取自Modern Perl:the book).
amo*_*mon 11
正如MeNoMore所说,第一类实体是您可以自由分配给变量等的语言的数据类型.在Perl中,这些包括:
那些可以驻留在符号表中.标量槽还可以被各种其他类型占用:
一些实体已经内置到构造塔语言:数字和字符串标量,列表表示对数组和哈希,[]以及{}匿名基于阵列和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中的内置类型可以有强制规则:
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)