当使用qr //操作符创建时,“使用现代Perl中的正则表达式是正则表达式”(取自Modern Perl:该书),这意味着什么?
解决方法
>标尺
>数组
>哈希
Coderefs(例如匿名子程序)
> IO
> Typeglobs(符号表是globs的哈希值)
>格式
那些可以驻留在符号表中.标量槽可以被各种其他类型所占据:
>有符号整数
>无符号整数
>浮点数
>弦
>参考文献
>正则表达式
这些实体中的一些具有内置的构造函数:标量的数字和字符串,数组和散列的列表符号,匿名数组和哈希表的[]和{}代码的子关键字,IO的开放函数对象,格式内置的格式,引用的引用运算符以及正则表达式的qr {}运算符.
Perl中有语言结构不是一级实体,不能分配给标量或其他一级实体.例如,包.此代码无效:
my $anonymous_package = package { ... }; # XXX
Shell命令有自己的内建,但是没有数据对象,所以这不行:
# 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中的内置类型可以具有强制规则:
数字和字符串来回强制.
>列表上下文中的单个标量是arity的列表1.
>标量上下文中的一个数组计算出数组的长度
可以将一个(偶数值)数组分配给散列
>可以将Hash分配给数组,以便将此数组分配给另一个哈希将重新创建相同的哈希
>标量上下文中的哈希值评估为(a)假值(如果为空)或(b)指示填充和分配的存储桶的数量的字符串,例如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 (?)
例如,coderefs需要更多的biilerplate代码:
sub foo {...} foo();
与
my $foo = sub {...}; $foo->(); # two possibilities &$foo();