您正在从Perl 5.34.2查看此文档的版本。查看最新版本
perlvar—Perl预定义变量
#变量名的语法
Perl中的变量名可以有多种格式。通常,它们必须以字母或下划线开头,在这种情况下,它们可以任意长(内部限制为251个字符),并且可以包含字母、数字、下划线或特殊序列::
或'
.在这种情况下,最后一个::
或'
被认为是包限定符; 看见珀尔莫德。非ASCII的Unicode字母不被视为字母,除非“使用utf8”
是有效的,并且适用更复杂的规则;看见perldata中的“标识符解析”了解详细信息。
Perl变量名也可以是数字序列、单个标点字符或两个字符序列:^
(插入符号或CIRCUMFLEX ACCENT)后跟任意一个字符[][A-Z^_?\]
。这些名称均由Perl保留,以供特殊使用;例如,全数字名称用于保存正则表达式匹配后由反向引用捕获的数据。
由于Perl v5.6.0,Perl变量名也可以是字母数字字符串,前面加上插入符号。这些都必须写在表格中${^Foo}(美元)
; 大括号不是可选的。${^Foo}(美元)
表示其名称被视为控件的标量变量-F类
然后是两个o个
的。这些变量由Perl保留以供将来特殊使用,但以开头的变量除外^_
(插入符号-下划线)。没有以开头的名字^_
将在任何未来版本的Perl中获得特殊含义;因此,在程序中可以安全地使用这些名称。$^_
然而,它本身,是保留。
以数字或标点符号开头的Perl标识符不受包裹
声明并始终强制打包主要的
; 他们也可以免于严格的“vars”
错误。其他一些名字也可以通过以下方式免除:
ENV标准DININC STDOUT公司ARGV标准ARGVOUT公司信号
特别是${^_XYZ}
变量总是在包中主要的
,无论任何包裹
当前范围内的声明。
#特殊变量
以下名称对Perl具有特殊意义。大多数标点符号名称都有合理的助记符或外壳中的类似物。然而,如果您希望使用长变量名,只需说:
使用英语;
在程序的顶部。这会将当前包中的所有短名称别名为长名称。有些甚至有中间名,通常借用自awk公司。有关更多信息,请参阅英语.
继续之前,请注意变量的排序顺序。一般来说,我们首先按大小写敏感的、几乎是最详细的顺序列出变量(忽略{
或^
前面的单词,如${^UNICODE}
或$^T美元
),尽管$_
和@_
向上移动到堆的顶部。对于具有相同标识符的变量,我们按标量、数组、哈希和裸字的顺序列出它。
#常规变量
- #美元ARG
-
- #$_
-
默认输入和图案搜索空间。以下配对是等效的:
while(<>){…}#仅在while中等价!while(已定义($_=<>)){…}/^主题:/$_=~/^主题:/tr/a-z/a-z型/$=~tr/a-z/a-z/咀嚼大杂烩($_)
以下是Perl将假定的位置$_
即使你不使用它:
以下函数使用$_
作为默认参数:
abs,alarm,chomp,chop,chr,chroot,cos,defined,eval,evalbytes,exp,fc,glob,hex,int,lc,lcfirst,length,log,lstat,mkdir,oct,ord,pos,print,printf,quotemeta,readlink,readpipe,ref,require,reverse(仅在标量上下文中),rmdir,say,sin,split(用于第二个参数),sqrt,stat,study,uc,ucfirst,unlink,unpack。
所有文件测试(-如果
,-d日
)除了-t吨
,默认为STDIN。请参见perlfunc中的“-X”
模式匹配操作米//
,秒///
和信托收据///
(又名年///
)使用时没有=~
操作员。
中的默认迭代器变量foreach公司
如果没有提供其他变量,则执行循环。
中的隐式迭代器变量grep()
和地图()
功能。
的隐式变量给定()
.
当<FH>
,读行
,读目录
或每个
操作结果作为唯一的标准进行测试虽然
测试。外部虽然
测试,这不会发生。
$_
是一个全局变量。
然而,在perl v5.10.0和v5.24.0之间,可以通过编写我的$_
.制作$_
参考全局$_
在相同的范围内我们的$_
。此实验性功能已被删除,现在是一个致命错误,但您可能会在旧代码中遇到它。
记忆:在某些操作中可以理解下划线。
- #@ARG公司
-
- #@_
-
在子例程中,数组@_
包含传递给该子例程的参数。在子程序内部,@_
是数组运算符的默认数组流行音乐
和转移
.
请参见珀尔苏布.
- #$列表分隔符
-
- #$"
-
将数组或数组切片插入双引号字符串或类似上下文时,例如/.../
,其元素由该值分隔。默认值为空格。例如:
打印“数组是:@array\n”;
等于:
打印“数组是:”。联接($“,@array)。”\n“;
助记符:在双引号上下文中工作。
- #$进程ID
-
- #$PID(PID)
-
- #$$
-
运行此脚本的Perl的进程号。尽管你可以设置此变量,通常不鼓励这样做,尽管它对于某些测试目的来说可能是非常宝贵的。它将自动重置叉子()
电话。
Linux和Debian GNU/kFreeBSD用户注意:在Perl v5.16.0perl使用LinuxThreads在Linux系统上模拟POSIX语义之前,这是POSIX线程的部分实现,后来被本机POSIX螺纹库(NPTL)取代。
LinuxThreads现在在Linux和缓存上已经过时获取pid()
这样就使得嵌入perl变得不必要地复杂(因为您必须手动更新$$的值),所以现在$$
和获取ppid()
将始终返回与底层C库相同的值。
Debian GNU/kFreeBSD系统在6.0发行版之前(包括6.0发行版)也使用LinuxThreads,但在那之后转移到类似POSIX的FreeBSD-线程语义。
要查看您的系统是否受到此差异的影响,请检查getconf GNU_LIBPTHREAD_VERSION | grep-q NPTL
返回错误值。NTPL线程保留POSIX语义。
记忆:与贝壳相同。
- #$程序名
-
- #$0
-
包含正在执行的程序的名称。
在某些(但不是所有)操作系统上,将$0
修改参数区域秒
程序看到。在某些平台上,您可能需要使用特殊的秒
选项或其他选项秒
以查看更改。修改$0
作为指示当前程序状态的方式,比隐藏正在运行的程序更有用。
请注意,对于$0
在最极端的情况下,它可能被限制在原稿所占的空间内$0
.
在某些平台中,修改后的名称后面可能有任意数量的填充,例如空格字符,如下所示秒
。在某些平台中,无论您做什么,此填充都会一直延伸到参数区域的原始长度(例如Linux 2.2就是这种情况)。
BSD用户注意:设置$0
不会从ps(1)输出中完全删除“perl”。例如,设置$0
到“foobar”
可能导致“perl:foobar(perl)”
(无论是“perl:”
前缀和“(perl)”后缀取决于您的BSD变体和版本)。这是操作系统的一项功能,Perl对此无能为力。
在多线程脚本中,Perl协调线程,以便任何线程都可以修改$0
ps(1)可以看到更改(假设操作系统继续运行)。请注意$0
其他线程不会更改,因为它们有自己的副本。
如果程序已通过开关提供给perl-e(电子)
或-电子
,$0
将包含字符串“-e”
.
在Linux上,从perl v5.14.0开始,遗留进程名称将设置为prctl(2)
,除了通过更改POSIX名称argv[0](argv[0)
正如perl自4.000版本以来所做的那样。现在,读取遗留进程名称(如ps、top和killall)的系统实用程序将识别您在分配给$0
。您提供的字符串将被截断为16个字节,这是Linux施加的限制。
助记符:与第页和科什.
- #$真实组ID
-
- #美元GID
-
- #$(
-
这个过程的真正意义。如果您所在的计算机同时支持多个组的成员身份,则会给出一个以空格分隔的组列表获取gid()
和后续的获取组()
,其中一个可能与第一个数字相同。
但是,指定给$(
必须是用于设置实际gid的单个数字。因此$(
应该不被分配回$(
不必强制使用数字,例如通过添加零。注意,这与有效gid不同($)
)这需要一个列表。
您可以同时更改实际gid和有效gid,方法是使用POSIX::setgid()
。对的更改$(
需要支票才能$!
在尝试更改后检测任何可能的错误。
助记符:括号用于组东西。真正的gid是你所在的团队左边如果你在运行setgid。
- #$EFFECTIVE_GROUP_ID
-
- #美元EGID
-
- #$)
-
这个过程的有效gid。如果您所在的计算机同时支持多个组的成员身份,则会给出一个以空格分隔的组列表获取注册表()
和后续的获取组()
,其中一个可能与第一个数字相同。
类似地,赋值给$)
还必须是一个空格分隔的数字列表。第一个数字设置有效gid,其余(如果有)传递给设置组()
。要获得空列表的效果,请执行以下操作集合组()
,只需重复新的有效gid;也就是说,强制有效gid为5,而有效gid则为空集合组()
比如说列表$) = "5 5"
.
您可以同时更改有效gid和实际gid,方法是使用POSIX::setgid()
(仅使用单个数字参数)。对的更改$)
需要支票才能$!
在尝试更改后检测任何可能的错误。
$<
,$>
,$(
和$)
只能在支持相应设置[re][ug]id()例行程序。$(
和$)
只能在支持setregid()
.
助记符:括号用于组东西。有效的gid是指正确的对你来说,如果你正在运行setgid。
- #$真实用户ID
-
- #美元UID
-
- #$<
-
此进程的真实uid。您可以同时更改实际uid和有效uid,方法是使用POSIX::setuid()
。自更改为$<
需要系统调用,请检查$!
更改后尝试检测任何可能的错误。
记忆术:是你来的液体从,如果您正在运行setuid。
- #$EFFECTIVE_USER_ID(美元有效_用户ID)
-
- #美元EUID
-
- #$>
-
此进程的有效uid。例如:
$< = $>; # 将real设置为有效uid($<,$>) = ($>,$<); # 交换真实有效的uid
您可以同时更改有效uid和实际uid,方法是使用POSIX::setuid()
。对的更改$>
需要支票才能$!
在尝试更改后检测任何可能的错误。
$<
和$>
只能在支持setreuid()
.
记忆术:是你去的液体到,如果您正在运行setuid。
- #$SUBSCRIPT_SEPARATOR(订阅_分离器)
-
- #$SUBSEP(美元)
-
- #$;
-
多维数组仿真的下标分隔符。如果将散列元素引用为
$foo{$x,$y,$z}
这真的意味着
$foo{join($;,$x,$y,$z)}
但不要把
@foo{$x,$y,$z}#a片——注意@
这意味着
($foo{$x}、$foo}$y}和$foo[$z})
默认值为“\034”,与中的SUBSEP相同awk公司。如果密钥包含二进制数据,则可能没有任何安全值$;
.
考虑使用中所述的“真实”多维数组珍珠糖.
助记符:逗号(句法下标分隔符)是一个半分号。
- #美元
-
- #十亿美元
-
使用时的特殊包变量排序()
,请参阅perlfunc中的“排序”.因为这种特殊性美元
和十亿美元
不需要声明(使用使用vars
,或我们的()
)即使使用严格的“vars”
杂注。不要将其词汇化我的$a
或我的b美元
如果您想在排序()
比较块或函数。
- #%ENV公司
-
散列%ENV公司
包含您当前的环境。在中设置值ENV公司
为随后的任何子进程更改环境叉子()
关闭。
从v5.18.0开始,键和值都存储在%环境
被串起来了。
我的$foo=1;$ENV{'bar'}=\$foo;if(参考$ENV{“bar”}){说出“5.18.0之前的行为”;}其他{说“5.18.0后行为”;}
以前,只有子进程收到stringified值:
我的$foo=1;$ENV{'bar'}=\$foo;#始终打印“non-ref”系统($^X,'-e',q/print(ref$ENV{'bar'}?'ref':'non-ref')/);
发生这种情况是因为您不能真正与外部进程共享任意数据结构。
- #$OLD_PERL_VERSION(旧版本)
-
- #$]
-
Perl解释器的修订、版本和颠覆,表示为5.XXXYYY形式的十进制,其中XXX是版本/1e3,YYY是颠覆/1e6。例如,Perl v5.10.1将为“5.010001”。
此变量可用于确定执行脚本的Perl解释器是否在正确的版本范围内:
如果“$]”<5.008,则警告“No PerlIO!\n”;
比较时$]
,应使用数值比较运算符,但应首先将变量字符串化,以避免其原始数值不准确的问题。
另请参阅文档使用VERSION
和需要版本
以方便在运行的Perl解释器太旧时失败。
请参见“$^V”将Perl版本表示为版本对象,它允许更灵活的字符串比较。
的主要优势$]
结束$^V美元
它在任何版本的Perl上都是一样的。缺点是,它不容易与其他格式的版本进行比较(例如,文字v字符串、“v1.2.3”或版本对象),数字比较受二进制浮点表示的影响;它有利于数字-文字版本检查,不利于与未进行完整性检查的变量进行比较。
这个$OLD_PERL_VERSION(旧版本)
由于历史原因,在Perl v5.20.0中添加了表单,但不鼓励使用它。(如果你有理由使用$]
是在旧perls上运行代码,然后将其引用为$OLD_PERL_VERSION(旧版本)
将是自我奋斗。)
记忆:这个版本的perl在右括号中吗?
- #$系统_FD_MAX
-
- #$^F美元
-
最大系统文件描述符,通常为2。系统文件描述符被传递到exec()
ed进程,而较高的文件描述符则不是。此外,在打开()
,系统文件描述符被保留,即使打开()
失败(在打开()
已尝试)。文件描述符的close-on-exec状态将根据$^F美元
打开相应的文件、管道或套接字时,而不是exec()
.
- #@F类
-
阵列@F类
包含打开自动拆分模式时读取的每行的字段。请参阅珀尔伦对于-一个开关。此数组特定于包,在下运行时,如果不在包main中,则必须声明或给定完整的包名称严格的“vars”
.
- #@INC公司
-
阵列@INC公司
包含的位置列表执行EXPR
,要求
,或使用
构件查找其库文件。它最初由任何-我命令行开关,后跟默认的Perl库,可能/usr/local/lib/perl。在Perl 5.26之前,.
-表示当前目录,包含在@INC公司
; 它已被删除。行为的这种变化记录在PERL_USE_UNSAFE_INC公司
不建议.
重新添加到@INC公司
。如果需要修改@INC公司
在运行时,您应该使用使用lib
pragma以正确加载机器相关库:
使用lib“/mypath/libdir/”;使用SomeMod;
您还可以通过将Perl代码直接放入@INC公司
这些钩子可以是子程序引用、数组引用或祝福对象。请参见perlfunc中的“require”了解详细信息。
- #%INC公司
-
散列%INC公司
包含通过做
,要求
,或使用
操作员。键是您指定的文件名(模块名转换为路径名),值是找到的文件的位置。这个要求
运算符使用此散列来确定是否已包含特定文件。
如果文件是通过钩子(例如子程序引用)加载的,请参见perlfunc中的“require”对于这些钩子的描述),此钩子默认插入到%INC公司
代替文件名。然而,请注意,挂钩可能设置了%INC公司
条目本身提供一些更具体的信息。
- #$INPLACE_EDIT(插入_编辑)
-
- #$^I美元
-
就地编辑扩展的当前值。使用未定义
禁用就地编辑。
助记符:的值-我开关。
- #@ISA公司
-
每个包都包含一个名为@ISA公司
它包含该类的父类(如果有)的列表。这个数组只是一个标量列表,每个标量都是与包名对应的字符串。当Perl执行方法解析时,将检查数组,这在佩洛布.
将包添加到时加载包@ISA公司
,请参阅起源杂注。泄气的人基础杂注也可以做到这一点,但除非与不鼓励使用的领域pragma是必需的。
- #^百万美元
-
默认情况下,内存不足是一个无法跟踪的致命错误。然而,如果构建得当,Perl可以使用^百万美元
作为紧急内存池死亡()
假设您的Perl是用编译的-DPERL_紧急_刹车
并使用了Perl的malloc。然后
$^M=‘a’x(1<<16);
将分配一个64K的缓冲区用于紧急情况。请参阅安装文件,以获取有关如何在编译Perl时添加自定义C编译标志的信息。为了阻止随意使用此高级功能英语此变量的长名称。
这个变量是在Perl 5.004中添加的。
- #$OS名称
-
- #$^0美元
-
在配置过程中确定的用于构建此Perl副本的操作系统的名称。有关示例,请参见perlport中的“平台”.
该值与$Config{“快照”}
。另请参阅配置和-V(V)中记录的命令行开关珀尔伦.
在Windows平台中,$^O美元
不是很有用:因为它总是MSWin32
,它无法区分95/98/ME/NT/2000/XP/CE/之间的差异。净利润。使用Win32::GetOSName()
或Win32::GetOSVersion()(请参见Win32(Win32)和珀尔波特)以区分变体。
这个变量是在Perl 5.003中添加的。
- #%SIG公司
-
散列%SIG公司
包含信号的信号处理程序。例如:
子处理程序{#第一个参数是信号名我的($sig)=@_;print“Caught a SIG$SIG--shutting down\n”;关闭(LOG);退出(0);}$SIG{'INT'}=\&handler;$SIG{'QUIT'}=\&handler;...$SIG{'INT'}='DEFAULT';#恢复默认操作$SIG{'QUIT'}='忽略';#忽略SIGQUIT
使用值“忽略”
通常具有忽略信号的效果,除了CHLD公司
信号。请参见佩利普有关此特殊情况的更多信息。使用空字符串或未定义
因为该值的效果与“默认”
.
以下是其他一些例子:
$SIG{“PIPE”}=“水管工”;#假设main::Plumber(不#推荐)$SIG{“管道”}=\&Plumber;#很好;假设电流#水管工$SIG{“PIPE”}=*水管工;#有点深奥$SIG{“PIPE”}=水管();#哎呀,水管()做了什么#返回??
确保不要将赤裸裸的单词用作信号处理程序的名称,以免无意中调用它。
使用与任何现有函数都不对应的字符串或不包含代码槽的glob相当于“忽略”
,但在调用处理程序时会发出警告(下面描述的内部挂钩不会发出警告)。
如果您的系统具有信号动作()
函数,然后使用它安装信号处理程序。这意味着您可以获得可靠的信号处理。
在Perl v5.8.0中,信号的默认传递策略从立即(也称为“不安全”)更改为延迟,也称为“安全信号”。请参见珍珠岩了解更多信息。
也可以使用%SIG公司
搞砸。由指示的例程$SIG{__WARN__}
将要打印警告消息时调用。警告消息作为第一个参数传递。存在__警告__
钩子使警告的普通打印标准错误
被压制。您可以使用此选项将警告保存在变量中,或将警告转换为致命错误,如下所示:
local$SIG{__WARN__}=子{die$_[0]};评估$proggie;
作为“忽略”
挂钩不受支撑__警告__
,其效果与使用相同“默认”
。可以使用空子例程禁用警告:
本地$SIG{__WARN__}=子{};
由指示的例程$SIG{__DIE__}(美元)
将引发致命异常时调用。错误消息作为第一个参数传递。当__模具__
钩子例程返回时,异常处理将继续进行,就像没有钩子时一样,除非钩子例程本身通过转到订阅(&S)
、循环出口或死亡()
. The__模具__
处理程序在调用期间被显式禁用,因此您可能会死于__模具__
处理程序。类似于__警告__
.
这个$SIG{__DIE__}(美元)
即使在评估()
。它从来没有打算以这种方式发生,但一个实现故障使其成为可能。这曾经被弃用,因为它允许在一定距离上执行奇怪的操作,如重写中的挂起异常$@
。由于用户发现重写挂起的异常实际上是一个有用的功能,而不是一个bug,因此纠正此问题的计划已被取消。
这个$SIG{__DIE__}(美元)
不支持“忽略”
; 它的效果与“默认”
.
__模具__
/__警告__
处理程序在一个方面非常特殊:可以调用它们来报告解析器发现的(可能的)错误。在这种情况下,解析器可能处于不一致的状态,因此任何从这样的处理程序计算Perl代码的尝试都可能会导致segfault。这意味着解析Perl时产生的警告或错误应格外小心,如下所示:
如果定义$^S,则需要Carp;鲤鱼::坦白(“有问题”),如果定义的话&鲤鱼::坦白;die“出了问题,但无法让Carp付出”.“回溯…\n\t”。“要查看回溯,请尝试使用-MCarp开关启动Perl”;
这里将加载第一行挑剔
除非是解析器调用了处理程序。第二行将打印回溯,如果挑剔
可用。只有在以下情况下才会执行第三行挑剔
不可用。
甚至不得不考虑$^S(美元)
异常处理程序中的变量是错误的。$SIG{__DIE__}(美元)
目前的实施会带来严重的、难以追踪的错误。避免使用,并使用结束{}
或CORE::GLOBAL::die重写。
请参见perlfunc中的“die”,perlfunc中的“警告”,perlfunc中的“eval”、和警告了解更多信息。
- #$BASETIME公司
-
- #$^T美元
-
程序开始运行的时间,以自纪元(1970年初)以来的秒为单位。返回的值-M(M),-A类、和-C类文件测试基于此值。
- #$版本
-
- #$^V(美元)
-
Perl解释器的修订、版本和颠覆,表示为版本对象。
这个变量首次出现在perl v5.6.0中;早期版本的perl将看到一个未定义的值。在perl v5.10.0之前$^V(美元)
表示为v字符串而不是版本对象。
$^V美元
可用于确定执行脚本的Perl解释器是否在正确的版本范围内。例如:
如果!则警告“哈希未随机化!\n”$^V或$^V lt v5.8.1
当版本对象重载字符串化时,要进行可移植转换$^V(美元)
在其字符串表示中,使用冲刺()
的“%vd”
转换,适用于v字符串或版本对象:
printf“版本为v%vd\n”,$^v;#Perl的版本
请参阅文档使用VERSION
和需要版本
以方便在运行的Perl解释器太旧时失败。
另请参见"$]"
以获取Perl版本的十进制表示。
的主要优势$^V(美元)
结束$]
就是说,对于Perl v5.10.0或更高版本,它重载了操作符,从而可以轻松地与其他版本表示进行比较(例如,十进制、文字v-string、“v1.2.3”或对象)。缺点是,在v5.10.0之前,它只是一个文字v字符串,不容易打印或比较,而$]
在所有版本的Perl上都保持不变。
助记符:对版本对象使用^V。
- #${^WIN32_SLOPPY_STAT}
-
此变量不再具有任何函数。
此变量在Perl v5.10.0中添加,在Perl v 5.34.0中删除。
- #$可执行名称
-
- #$^X(美元)
-
用于执行当前Perl副本的名称,来自Cargv[0](argv[0)
或(在支持的情况下)/进程/self/exe.
根据主机操作系统$^X(美元)
可以是perl程序文件的相对或绝对路径名,也可以是用于调用perl的字符串,但不能是perl文件的路径名。此外,大多数操作系统允许调用不在PATH环境变量中的程序,因此不能保证$^X美元
位于PATH中。对于VMS,该值可能包含也可能不包含版本号。
通常可以使用$^X(美元)
重新生成当前运行的同一perl的独立副本,例如。,
@first_run=`$^X-le“为1..100打印int rand 100”`;
但回想一下,并非所有操作系统都支持命令输出的分叉或捕获,因此这个复杂语句可能不可移植。
使用的值是不安全的$^X美元
作为文件的路径名,因为在可执行文件上具有强制后缀的某些操作系统在调用命令时不需要使用后缀。转换的值$^X(美元)
对于路径名,请使用以下语句:
#建立一组文件名(而不是命令名)。使用配置;我的$this_perl=$^X;if($^O ne“VMS”){$this_perl.=美元$配置{_exe}除非$this_perl=~m/$Config{_exe}$/i;}
由于许多操作系统允许任何对Perl程序文件具有读访问权限的人制作它的副本,对副本进行修补,然后执行副本,因此具有安全意识的Perl程序员应该注意调用已安装的Perl副本,而不是调用$^X(美元)
。以下语句实现了这一目标,并生成了一个路径名,可以作为命令调用或作为文件引用。
使用配置;my$secure_perl_path=$Config{perlpath};if($^O ne“VMS”){$secure_perl_path=$配置{_exe}除非$secure_perl_path=~m/$Config{_exe}$/i;}
大多数与正则表达式相关的特殊变量都是副作用。Perl在成功匹配时设置这些变量,因此在使用它们之前应该检查匹配结果。例如:
如果(/P(A)TT(ER)N/){打印“我找到了$1和$2\n”;}
除非我们另有说明,否则这些变量是只读的,并且是动态范围的。
正则表达式变量的动态特性意味着它们的值仅限于它们所在的块,如以下代码所示:
my$outer=“华莱士和格罗姆米特”;my$internal=“穆特和杰夫”;我的$pattern=qr/(\S+)和(\S+/);sub-show_n{print“\$1是$1;\$2是$2\n”}{外部:如果$outer=~m/$pattern/;,则为show_n();内部:{show_n(),如果$inner=~m/$pattern/;}show_n();}
输出显示,在外部
块的值$1
和$2
来自与之比赛的外部$
。在内部
块的值$1
和$2
来自与之比赛的$内部
,但仅限于块末尾(即动态范围)。在内部
块完成时,值为$1
和$2
返回匹配的值外部$
尽管我们还没有进行过另一场比赛:
1美元是华莱士$2是Grommit1美元是羊肉$2是杰夫1美元是华莱士$2是Grommit
传统上,在Perl中,三个变量中的任何一个都可以使用$`
,$&
或$'
(或他们的使用英语
等价物),导致所有后续成功的模式匹配生成匹配字符串的副本,以防代码随后访问其中一个变量。这对整个程序造成了相当大的性能损失,因此通常不鼓励使用这些变量。
在Perl 5.6.0中@-
和@+
引入了动态数组来提供成功匹配的指标。例如,您可以这样做:
$str=~/pattern/;打印$`,$&,$';#坏:性能受到影响打印#good:无性能影响子字符串($str,0,$-[0]),子字符串($str,$-[0],$+[0]-$-[0),子字符串($str,$+[0]);
在Perl 5.10.0中/第页
匹配运算符标志和${^预匹配}
,${^匹配}
、和${^POSTMATCH}
引入了变量,只允许您对标记为/第页
.
在Perl 5.18.0以后的版本中,Perl开始分别记录这三个变量中的每一个变量,并且只复制了所需字符串的那一部分;所以在
$`; $&; “abcdefgh”=~/d/
perl只会复制字符串的“abcd”部分
$str=“x”x 1_000_000;$&; # 呜呜$str=~/x/g#一个字符复制了一百万次,而不是一百万个字符
在Perl 5.20.0中,默认情况下启用了一个新的copy-on-write系统,它最终修复了这三个变量的所有性能问题,并使它们可以安全地在任何地方使用。
这个开发单位:NYTProf
和开发::FindAmpersand
模块可以帮助您在代码中找到这些有问题的匹配变量的用法。
- #$<数字> ($1, $2, ...)
-
包含来自上一次成功模式匹配的捕获圆括号对应集合的子模式,不计算已经退出的嵌套块中匹配的模式。
注意,与空字符串匹配的捕获缓冲区与可选的捕获缓冲区分开来。如,(x?)
和(x) ?
后者可能是不确定的,前者则不是。
这些变量是只读的,并且是动态范围的。
助记符:类似\数字。
- #@{^捕获}
-
一个数组,它公开上一次成功模式匹配的捕获缓冲区的内容(如果有的话),而不计算已经退出的嵌套块中匹配的模式。
注意,@{^CAPTURE}的0索引等价于$1,1索引等价于$2,以此类推。
if(“马驹”=~/(.)(.){打印连接“-”,@{^CAPTURE};}
应输出“f-o-a-l”。
另请参见"$<数字> ($1, $2, ...)",“%{^CAPTURE}”和“%{^CAPTURE_ALL}”.
注意,与大多数其他正则表达式魔法变量不同,没有一个字母等价于@{^捕获}
.
此变量在5.25.7中添加
- #$匹配
-
- #$&
-
上一次成功的模式匹配匹配的字符串(不包括BLOCK或评估()
由当前BLOCK封闭)。
请参见“性能问题”上面介绍了在代码中使用此变量(即使只使用一次)对性能的严重影响。
此变量是只读的,并且具有动态范围。
记忆:喜欢&
在一些编辑中。
- #${^匹配}
-
这与$&
($匹配
)但它不会引起与该变量相关的性能损失。
请参见“性能问题”以上。
在Perl v5.18及更早版本中,只有在使用/第页
修改器。在Perl v5.20中/第页
修饰符什么也不做,所以${^匹配}
做的事情和$匹配
.
此变量是在Perl v5.10.0中添加的。
此变量是只读的,并且具有动态范围。
- #$预赛
-
- #$`
-
上一次成功的模式匹配匹配的what之前的字符串,不计算隐藏在BLOCK或评估
由当前BLOCK封闭。
请参见“性能问题”上面介绍了在代码中使用此变量(即使只使用一次)对性能的严重影响。
此变量是只读的,并且具有动态范围。
助记符:`
通常位于带引号的字符串之前。
- #${^预匹配}
-
这类似于$`
($PREMATCH),但它不会导致与该变量相关的性能损失。
请参见“性能问题”以上。
在Perl v5.18及更早版本中,只有在使用/第页
修改器。在Perl v5.20中/第页
修饰符什么也不做,所以${^预匹配}
做的事情和$预赛
.
此变量是在Perl v5.10.0中添加的。
此变量是只读的,并且具有动态范围。
- #$邮寄
-
- #$'
-
上一次成功的模式匹配所匹配的内容后面的字符串(不计算隐藏在BLOCK或评估()
由当前BLOCK封闭)。例子:
local$_='abcdefghi';/定义/;打印“$`:$&:$'\n”;#打印abc:def:ghi
请参见“性能问题”上面介绍了在代码中使用此变量(即使只使用一次)对性能的严重影响。
此变量是只读的,并且具有动态范围。
助记符:'
通常跟在带引号的字符串后面。
- #${^POSTMATCH}
-
这类似于$'
(美元邮戳
)但它不会引起与该变量相关的性能损失。
请参见“性能问题”以上。
在Perl v5.18及更早版本中,只有在使用/第页
修改器。在Perl v5.20中/第页
修饰符什么也不做,所以${^POSTMATCH}
做的事情和$邮寄
.
此变量是在Perl v5.10.0中添加的。
此变量是只读的,并且具有动态范围。
- #$LAST_PAREN_MATCH(最后一个帕伦匹配)
-
- #$+
-
上次成功搜索模式中使用次数最多的捕获组匹配的文本。它在逻辑上等价于编号最高的捕获变量($1
,$2
, ...) 它具有定义的值。
如果您不知道一组备选模式中的哪一个匹配,这将非常有用。例如:
/版本:(.*)|修订:(.x)/&&($rev=$+);
此变量是只读的,并且具有动态范围。
记忆:积极乐观。
- #$LAST_SUBMATCH_RESULT(最后_子匹配_结果)
-
- #$^N美元
-
最后一个成功搜索模式的最新关闭的组(即带有最右边的右括号的组)匹配的文本。这与$+
。例如
“ab”=~/^((.)(.))$/
我们有
$1,$^N的值为“ab”$2的值为“a”$3、$+的值为“b”
这主要用于内部(?{...})
用于检查最近匹配的文本的块。例如,为了有效地将文本捕获到变量中(除了$1
,$2
,等等),替换(...)
具有
(?:(…)(?{$var=$^N})
通过设置然后使用$变量
这样,您就不用担心它们到底是哪一组带编号的括号。
此变量是在Perl v5.8.0中添加的。
助记符:(可能)最近关闭的嵌套括号。
- #@最后_匹配_结束
-
- #@+
-
此数组保存当前活动动态作用域中最后一个成功子匹配末端的偏移量。$+[0]
是整个匹配结束时字符串的偏移量。这与销售时点情报系统
函数在调用与之匹配的变量时返回。这个n个此数组的第个元素包含n个第次比赛,所以$+[1]
是经过的偏移量$1
末端,$+[2]
偏移过去的位置$2
末端,等等。您可以使用$#+
以确定上次成功匹配中有多少个分组。请参阅为@-
变量。
这个变量是在Perl v5.6.0中添加的。
- #%{^捕获}
-
- #%最后一个帕伦匹配
-
- #%+
-
类似@+
,的%+
hash允许在当前活动动态作用域中最后一次成功匹配时访问命名的捕获缓冲区(如果存在)。
例如,$+{foo}
等于$1
在以下比赛之后:
“foo”=~/(?<foo>foo)/;
的键%+
哈希仅列出已捕获的缓冲区的名称(因此与定义的值关联)。
如果多个不同的捕获组具有相同的名称,则$+{NAME}(姓名)
将引用匹配中最左侧定义的组。
The underlying behaviour of%+
由领带::哈希::NamedCapture模块。
注: %-
和%+
将视图绑定到与最后一个成功的正则表达式关联的公共内部哈希中。因此,通过以下方式混合迭代访问每个
可能会产生不可预测的结果。同样,如果上次成功的比赛发生变化,那么结果可能会令人惊讶。
此变量是在Perl v5.10.0中添加的。这个%{^捕获}
别名在5.25.7中添加。
此变量是只读的,并且具有动态范围。
- #@上次匹配启动
-
- #@-
-
$-[0]
是上次成功匹配开始的偏移量。$-[n个]
是与匹配的子字符串开始的偏移量n个-如果子模式不匹配,则为undef。
因此,在与$_
,$&
与…一致子$_,$-[0],$+[0]-$-[0
同样$n个与…一致子$_,$-[n],$+[n]-$-[n]
如果$-[n]美元
定义,并且$+与子$_,$-[$#-],$+[$#-]-$-[$#-]
。可以使用$#-
查找上次成功匹配中最后匹配的子组。与…对比$#+
,正则表达式中的子组数。与进行比较@+
.
此数组保存当前活动动态作用域中最后成功子匹配的开始偏移量。$-[0]
是整个匹配开头字符串的偏移量。这个n个此数组的第个元素包含n个第次比赛,所以$-[1]
是偏移量,其中$1
开始,$-[2]
偏移量,其中$2
开始,依此类推。
与某个变量匹配后$变量
:
- #
$`
与相同子项($var,0,$-[0])
-
- #
$&
与相同子项($var、$-[0]、$+[0]-$-[0)
-
- #
$'
与相同子项($var,$+[0])
-
- #
$1
与相同substr($var,$-[1],$+[1]-$-[1])
-
- #
$2
与相同substr($var,$-[2],$+[2]-$-[2])
-
- #
$3
与相同substr($var,$-[3],$+[3]-$-3])
-
这个变量是在Perl v5.6.0中添加的。
- #%{^CAPTURE_ALL}
-
- #%-
-
类似%+
,此变量允许访问当前活动动态作用域中上次成功匹配的命名捕获组。对于正则表达式中找到的每个捕获组名称,它将一个引用与一个数组相关联,该数组包含由具有该名称的所有缓冲区捕获的值列表(如果有多个缓冲区),按它们出现的顺序排列。
下面是一个示例:
如果('1234'=~/(?<A>1)(?<B>2)(?<A>3)(?>B>4)/){foreach我的$bufname(排序键%-){我的$ary=$-{$bufname};对于每个$idx(0..$#$ary){打印“\$-{$bufname}[$idx]:”,(已定义($ary->[$idx])? “'$ary->[$idx]'”:“undef”),“\n”;}}}
将打印出:
$-{A}[0]:“1”$-{A}[1]:“3”$-{B}[0]:“2”$-{B}[1]:“4”
的键%-
哈希对应于正则表达式中找到的所有缓冲区名称。
的行为%-
通过领带::哈希::NamedCapture模块。
注: %-
和%+
将视图绑定到与最后一个成功的正则表达式关联的公共内部哈希中。因此,通过混合迭代访问每个
可能会产生不可预测的结果。同样,如果上次成功的比赛发生变化,那么结果可能会令人惊讶。
此变量是在Perl v5.10.0中添加的。这个%{^CAPTURE_ALL}
别名在5.25.7中添加。
此变量是只读的,并且具有动态作用域。
- #$LAST_REGEXP_CODE_RESULT(最后_调整_代码_结果)
-
- #$^卢比
-
上次成功的评估结果(?{code})
正则表达式断言(请参见珍珠岩). 可以写信给。
这个变量是在Perl 5.005中添加的。
- #${^RE_COMPILE_recuration_LIMIT}
-
当前值给出了正则表达式编译期间任何时候可能存在的打开但未关闭的括号组的最大数量。默认值当前为1000个嵌套组。您可以根据需要和可用内存量进行调整。
此变量是在Perl v5.30.0中添加的。
- #${^RE_DEBUG_FLAGS}
-
正则表达式调试标志的当前值。设置为0表示没有调试输出,即使重新“调试”
模块已加载。请参见重新了解详细信息。
此变量是在Perl v5.10.0中添加的。
- #${^RE_TRIE_MAXBUF}
-
控制如何应用某些正则表达式优化以及它们使用的内存量。默认情况下,该值为65536,对应于512kB临时缓存。将此设置为更高的值,以便在匹配大型交替时以内存换取速度。如果希望优化尽可能节省内存,但仍会发生,请将其设置为较低的值,并将其设置成负值,以防止优化并保留最多内存。在正常情况下,您应该对该变量不感兴趣。
此变量是在Perl v5.10.0中添加的。
依赖于当前所选文件句柄的变量可以通过调用IO::句柄
对象,尽管这比使用常规内置变量效率低。(下面的摘要行包含单词HANDLE。)首先你必须说
使用IO::句柄;
之后您可以使用
方法HANDLE EXPR
或更安全,
HANDLE->方法(EXPR)
每个方法都返回IO::手柄
属性。每个方法都采用可选的EXPR,如果提供了EXPR的话,它将为IO::句柄
有问题的属性。如果没有提供,大多数方法对当前值不做任何操作--除了自动冲洗()
,这将为您假设1,只是为了与众不同。
因为加载到IO::句柄
类是一个昂贵的操作,您应该学习如何使用常规的内置变量。
其中一些变量被视为“只读”。这意味着,如果您尝试直接或间接通过引用分配给该变量,则会引发运行时异常。
修改本文档中描述的大多数特殊变量的默认值时,您应该非常小心。在大多数情况下,您希望在更改这些变量之前对其进行本地化,因为如果不这样做,更改可能会影响其他依赖已更改的特殊变量的默认值的模块。以下是一次读取整个文件的正确方法之一:
打开我的$fh、“<”、“foo”或die$!;本地$/;#启用局部发出的声音模式我的$content=<$fh>;关闭$fh;
但以下代码非常糟糕:
打开我的$fh、“<”、“foo”或die$!;undef$/;#启用咯咯声模式我的$content=<$fh>;关闭$fh;
由于其他一些模块可能希望以默认的“行模式”从某些文件中读取数据,因此如果我们刚才提供的代码已经执行$/
现在,对于在同一Perl解释器中运行的任何其他代码,都进行了更改。
通常,当变量本地化时,您希望确保此更改影响的范围尽可能短。所以除非你已经在短时间内{}
块,你应该自己创建一个。例如:
我的$content='';打开我的$fh、“<”、“foo”或die$!;{本地$/;$content=<$fh>;}关闭$fh;
以下是您自己的代码如何被破坏的示例:
对于(1..3){$\=“\r\n”;nasty_break();打印“$_”;}亚纳斯提断裂{$\=“\f”;#做某事$_}
您可能希望此代码打印等效的
“1\r\n2\r\n3\r\n”
但你会得到:
“1\f2\f3\f”
为什么?因为nasty_break()
修改$\
而不需要先进行本地化。您在中设置的值nasty_break()
你回来时还在那里。修复方法是添加本地()
所以值不会泄漏nasty_break()
:
本地$\=“\f”;
在这样一个简短的示例中,很容易注意到这个问题,但在更复杂的代码中,如果不将更改本地化到特殊变量,则会出现问题。
- #美元ARGV
-
包含读取时当前文件的名称<>
.
- #@ARGV公司
-
阵列@ARGV公司
包含用于脚本的命令行参数。$#ARGV
通常是参数的数量减去一,因为$ARGV[0]
是第一个参数,不程序的命令名本身。请参见"$0"作为命令名。
- #ARGV公司
-
在中迭代命令行文件名的特殊文件句柄@ARGV公司
。通常在角度运算符中写为空文件句柄<>
注意,目前ARGV公司
只有在<>
操作员;在其他地方,它只是与最后打开的文件相对应的普通文件句柄<>
尤其是通过\*ARGV公司
作为需要文件句柄的函数的参数,可能不会导致函数自动读取中所有文件的内容@ARGV公司
.
- #ARGVOUT公司
-
使用进行编辑处理时指向当前打开的输出文件的特殊文件句柄-我。当您必须进行大量插入并且不想继续修改时非常有用$_
。请参阅珀尔伦对于-我开关。
- #IO::句柄->输出字段分隔符(EXPR)
-
- #$输出_字段_分离器
-
- #美元OFS
-
- #$,
-
打印操作员的输出字段分隔符。如果定义了该值,则在每个print参数之间打印该值。默认值为未定义
.
你不能打电话输出字段分隔符()
在句柄上,仅作为静态方法。请参见IO::手柄.
助记符:打印语句中有“,”时打印的内容。
- #处理->input_line_number(EXPR)
-
- #$INPUT_LINE_NUMBER(输入线编号)
-
- #NR美元
-
- #$.
-
最后访问的文件句柄的当前行号。
Perl中的每个文件句柄都计算从中读取的行数。(取决于$/
,Perl对线条构成的想法可能与您的想法不符。)从文件句柄读取行时(通过readline()
或<>
),或何时tell()
或搜索()
被召唤,$.
成为该文件句柄的行计数器的别名。
您可以通过指定$.
,但这实际上不会移动搜索指针。本地化$.
不会本地化文件句柄的行数相反,它将本地化perl的文件句柄概念$.
当前别名为。
$.
当文件句柄关闭时重置,但不当打开的文件句柄重新打开时关闭()
。有关更多详细信息,请参阅perlop中的“I/O操作符”.因为<>
永远不会明确结束,行号会增加ARGV公司
文件(但请参见中的示例perlfunc中的“eof”).
您还可以使用处理->input_line_number(EXPR)
访问给定文件句柄的行计数器,而不必担心上次访问的句柄。
助记符:许多程序使用“.”表示当前行号。
- #IO::句柄->输入记录分隔符(EXPR)
-
- #$INPUT_RECORD_SEPARATOR(输入_记录_分离器)
-
- #美元RS
-
- #$/
-
输入记录分隔符,默认为换行符。这影响了Perl对“线”是什么的想法awk公司的RS变量,包括如果设置为空字符串(空行不能包含任何空格或制表符),则将空行视为终止符。您可以将其设置为多字符字符串以匹配多字符终止符,也可以设置为未定义
读取文件末尾。将其设置为“\n\n”
意味着与设置为略有不同""
,如果文件包含连续的空行。设置为""
将两个或多个连续的空行视为一个空行。设置为“\n\n”
会盲目地假设下一个输入字符属于下一段,即使它是换行符。
本地$/;#启用“slurp”模式本地$_=<FH>;#现在在此处显示整个文件s/\n[\t]+//g;
记住:$/
是字符串,而不是正则表达式。awk公司必须做得更好。:-)
设置$/
到空字符串--所谓的段落模式--值得特别关注。什么时候?$/
设置为""
如果使用该设置读入整个文件,则文件开头的一个或多个连续换行的任何序列都将被丢弃。除了文件中的最后一条记录外,以两个或多个换行符结尾的每个字符序列都被视为一条记录,并被读入以正好两个换行结束。如果文件中的最后一条记录以零行或一个连续的换行结束,则会使用该数量的换行读取该记录。如果最后一条记录以两个或多个连续的换行结束,则会像前面的所有记录一样,用两个换行读入它。
假设我们将以下字符串写入文件:
my$string=“\n\n\n”;$string.=“alpha beta\ngamma delta\n\n\n”;$string.=“epsilon zeta eta \n\n”;$字符串=“θ\n”;my$文件=“simple_file.txt”;打开我的$OUT、'>'、$file或die;打印$OUT$string;关闭$OUT或死亡;
现在我们以段落模式读取该文件:
本地$/=“”;#段落模式打开我的$IN、'<'、$file或die;my@records=<$IN>;关闭$IN或死亡;
@记录
将由这3个字符串组成:
(“alpha beta\ngamma delta\n\n”,“epsilonζeta \n\n”,“θ\n”,)
设置$/
对于对整数的引用,包含整数的标量或可转换为整数的标数将尝试读取记录而不是行,最大记录大小为引用的整数字符数。所以这个:
本地$/=\32768;#或“32768”,或\$var_containing_32768打开我的$fh、“<”、$myfile或die$!;本地$_=<$fh>;
将从$fh中读取不超过32768个字符的记录。如果您不是从面向记录的文件中读取数据(或者您的操作系统没有面向记录的数据),那么每次读取都可能会得到完整的数据块。如果一条记录大于您设置的记录大小,那么您将得到零碎的记录。不推荐尝试将记录大小设置为零或更小,这将导致$/的值为“undef”,从而导致读取整个文件(其余部分)。
自5.19.9设置起$/
任何其他形式的引用都会抛出致命的异常。这是为了支持新的设置方式$/
未来。
仅在VMS上,记录读取绕过PerlIO层和任何相关的缓冲区,因此不能在同一文件句柄上混合记录读取和非记录读取。只有当两种模式使用相同的缓冲层时,录制模式才会与线路模式混合。
你不能打电话输入记录分隔符()
在句柄上,仅作为静态方法。请参见IO::句柄.
另请参见perlport中的“新品”。另请参阅"$.".
助记符:/在引用诗歌时划定行边界。
- #IO::句柄->输出记录分离器(EXPR)
-
- #$OUTPUT_RECORD_SEPARATOR($输出_记录_分离器)
-
- #美元ORS
-
- #$\
-
打印操作员的输出记录分隔符。如果已定义,则在最后一个print参数之后打印此值。默认值为未定义
.
你不能打电话输出记录分离器()
在句柄上,仅作为静态方法。请参见IO::句柄.
记忆:你设置$\
而不是在打印结束时添加“\n”。此外,它就像$/
,但它是您从Perl“返回”的内容。
- #手柄->自动冲洗(EXPR)
-
- #$输出_AUTOFLUSH
-
- #$|
-
如果设置为非零,则在当前选定的输出通道上每次写入或打印后立即强制刷新。默认值为0(无论通道是否真正由系统缓冲;$|
只告诉您是否在每次写入后显式要求Perl刷新)。如果输出是到终端的,则STDOUT通常是线缓冲的,否则是块缓冲的。设置此变量主要在输出到管道或套接字时有用,例如当您在下运行Perl程序时rsh公司并希望看到正在发生的输出。这对输入缓冲没有影响。请参阅perlfunc中的“getc”为了这个。请参见perlfunc中的“select”如何选择输出通道。另请参见IO::句柄.
助记符:当你想让你的管道滚烫时。
- #${^LAST_FH}(美元)
-
此只读变量包含对last-read文件句柄的引用。这是由设置的<手柄>
,读行
,告诉
,电动势
和寻求
。这个手柄和$.
和告诉
和电动势
无参数使用。它也是Perl在错误或警告消息中附加“,<STDIN>line1”时使用的句柄。
此变量是在Perl v5.18.0中添加的。
格式的特殊变量是文件句柄的子集。请参见珍珠岩有关Perl格式的更多信息。
- #$累加器
-
- #$^A(美元)
-
的当前值写入()
蓄能器格式()
线。格式包含表单行()
将结果输入到$^A(美元)
。调用其格式后,写入()
打印出的内容$^A(美元)
然后清空。所以你从来没有真正看到$^A(美元)
除非你打电话表单行()
你自己看,看珍珠岩和perlfunc中的“formline PICTURE,LIST”.
- #IO::句柄->format_formfeed(EXPR)
-
- #$FORMAT_FORMFEED格式
-
- #$^L(美元)
-
作为换页输出的格式。默认值为\(f)
.
你不能打电话format_formfeed()
在句柄上,仅作为静态方法。请参见IO::句柄.
- #句柄->format_page_number(EXPR)
-
- #$格式_页面_编号
-
- #$%
-
当前选定输出通道的当前页码。
助记符:%
页码在n关.
- #句柄->format_lines_left(EXPR)
-
- #$格式_行_左
-
- #$-
-
当前选定输出通道页面上剩余的行数。
助记符:lines_on_page-lines_printed。
- #IO::句柄->format_line_break_characters EXPR
-
- #$FORMAT_LINE_BREAK_CHARACTERS格式
-
- #$:
-
当前的一组字符,在这组字符之后,可以断开字符串以填充延续字段(从开始^
)格式。默认值为“\n-”,在空格、换行符或连字符上中断。
你不能打电话format_line_break_characters()
在句柄上,仅作为静态方法。请参见IO::句柄.
助记符:诗歌中的“冒号”是一行的一部分。
- #处理->format_lines_per_page(EXPR)
-
- #$FORMAT_LINES_PER_PAGE格式
-
- #$=
-
当前选定输出通道的当前页面长度(可打印行)。默认值为60。
助记符:=有水平线。
- #HANDLE->格式_top_name(EXPR)
-
- #$格式_操作_名称
-
- #$^
-
当前选定输出通道的当前页面顶部格式的名称。默认值是文件句柄的名称_顶部
附件。例如STDOUT公司
文件句柄为STDOUT_TOP(STDOUT_顶部)
.
助记符:指向页面顶部。
- #句柄->format_name(EXPR)
-
- #$格式_名称
-
- #$~
-
当前所选输出通道的当前报告格式的名称。默认格式名称与文件句柄名称相同。例如STDOUT公司
文件句柄只是STDOUT公司
.
记忆:兄弟$^
.
#错误变量
变量$@
,$!
,$^E(美元)
、和$?
包含有关在执行Perl程序期间可能出现的不同类型错误条件的信息。变量按报告错误的子系统和Perl进程之间的“距离”排序。它们分别对应于Perl解释器、C库、操作系统或外部程序检测到的错误。
为了说明这些变量之间的差异,请考虑以下使用单引号字符串的Perl表达式。执行此语句后,Perl可能设置了所有四个特殊错误变量:
评估q{打开我的$pipe,“/cdrom/install|”或die$!;my@res=<$pipe>;关闭$pipe或死“坏管道:$?,$!”;};
当perl执行评估()
表达式,它翻译打开()
,<管道>
、和关闭
调用C运行时库,然后调用操作系统内核。perl集合$!
到C库的错误编号
如果其中一个调用失败。
$@
如果字符串为评估
-ed没有编译(如果打开
或关闭
或者如果在计算期间执行Perl代码死亡()
d.在这些情况下$@
是编译错误,或的参数死亡
(这将插入$!
和$?
). (另请参阅致命的尽管如此。)
在一些操作系统下,$^E(美元)
可能包含更详细的错误指示器,例如在本例中,“CDROM托盘未关闭”。不支持扩展错误消息的系统会离开$^E(美元)
一样$!
.
最后,$?
如果外部程序/cdrom/安装失败。高8位反映程序遇到的特定错误条件(程序的退出()
值)。低8位反映故障模式,如信号死亡和堆芯转储信息。请参见等待(2)了解详细信息。与…对比$!
和$^E(美元)
,仅当检测到错误条件时才设置,变量$?
设置在每个等待
或管道关闭
,覆盖旧值。这更像是$@
,每个评估()
总是以失败告终,以成功告终。
有关更多详细信息,请参阅上的个人描述$@
,$!
,$^E(美元)
、和$?
.
- #${^儿童_错误_积极}
-
最后一个管道关闭、反勾号返回的本机状态(``
)命令,成功调用wait()
或waitpid()
,或来自系统()
操作员。在类似POSIX的系统上,可以使用WIFEXITED、WEXITSTATUS、WIFSIGNALED、WTERMSIG、WIFSTOPPED和WSTOPSIG函数对该值进行解码,这些函数由POSIX公司模块。
在VMS下,这反映了实际的VMS退出状态;即,它与$?
当杂注使用vmsish“状态”
已生效。
此变量是在Perl v5.10.0中添加的。
- #$扩展_OS_ERROR
-
- #$^E(美元)
-
特定于当前操作系统的错误信息。目前,这与"$!"
仅在VMS、OS/2和Win32(以及MacPerl)下。在所有其他平台上,$^E(美元)
总是和$!
.
在VMS下,$^E(美元)
提供上次系统错误的VMS状态值。这是有关上次系统错误的更具体的信息,而不是$!
。这在以下情况下尤为重要$!
设置为EVMSERR公司.
在OS/2下,$^E(美元)
设置为通过CRT或直接从perl调用OS/2 API的最后一次调用的错误代码。
在Win32下,$^E(美元)
总是返回Win32调用报告的最后一个错误信息获取上次错误()
描述Win32 API中的最后一个错误。大多数Win32特定代码将通过以下方式报告错误$^E(美元)
.ANSI C和类Unix调用集错误编号
因此,大多数可移植的Perl代码都会通过以下方式报告错误$!
.
说明中提到的注意事项"$!"
通常适用于$^E(美元)
,也是。
这个变量是在Perl 5.003中添加的。
记忆法:额外的错误解释。
- #$EXCEPTIONS_BEING_CAUGHT例外
-
- #$^秒
-
解释器的当前状态。
$^S州--------- -------------------------------------undef分析模块、eval或主程序true(1)执行evalfalse(0)否则
第一种状态可能发生在$SIG{__DIE__}(美元)
和$西格{__WARN__}
处理程序。
英文名称$EXCEPTIONS_BEING_CAUGHT有点误导,因为未定义
值不指示是否捕获异常,因为主程序的编译不会捕获异常。
这个变量是在Perl 5.004中添加的。
- #$警告
-
- #$^W(美元)
-
警告开关的当前值,初始为true,如果-w个已使用,否则为false,但可直接修改。
另请参见警告.
助记符:与-w个开关。
- #${^警告_BITS}
-
由使用警告
杂注。它的作用域与$^H(美元)
和%^H(H)
变量。精确值被认为是内部的警告pragma和可能会在不同版本的Perl之间更改。
这个变量是在Perl v5.6.0中添加的。
- #$OS_错误
-
- #$错误
-
- #$!
-
引用时,$!
检索C的当前值错误编号
整数变量。如果$!
分配了一个数值,该值存储在错误编号
。当作为字符串引用时,$!
产生对应于的系统错误字符串错误编号
.
设置了多个系统或库调用错误编号
如果它们失败了,说明失败的原因。他们通常会这样不设置错误编号
如果成功并可能设置错误编号
成功时为非零值。这意味着错误编号
,因此$!
,仅有意义立即在a之后失败:
if(打开我的$fh,“<”,$filename){#这里$!毫无意义。...}其他{#这里只有$!有意义。...#已经在这里$!可能毫无意义。}#既然在这里我们要么成功要么失败,# $! 毫无意义。
在这里,无意义的意味着$!
可能与打开()
操作员。分配给$!
同样短暂。它可以在调用死亡()
运算符,以设置退出值,或检查与错误对应的系统错误字符串n个,或恢复$!
达到有意义的状态。
Perl本身可以设置错误编号
即使没有执行系统调用,也会在失败时变为非零。
助记符:刚才发生了什么?
- #%OS_错误
-
- #%ERRNO公司
-
- #%!
-
每个元素%!
只有当$!
设置为该值。例如,$!{ENOENT}(英文)
当且仅当的当前值$!
是ENOENT公司
; 也就是说,如果最近的错误是“No such file or directory”(没有这样的文件或目录)(或者它的道德等价物:不是所有的操作系统都给出准确的错误,当然也不是所有的语言都给出)。不保证特定的真值,但在过去通常是$!
。要检查特定密钥在系统上是否有意义,请使用存在$!{密钥}
; 有关合法密钥的列表,请使用密钥%!
。请参阅埃雷诺有关更多信息,另请参阅"$!".
这个变量是在Perl 5.005中添加的。
- #$儿童_错误
-
- #$?
-
最后一次管道关闭返回的状态,反勾号(``
)命令,成功调用wait()
或waitpid()
,或来自系统()
操作员。这只是传统Unix返回的16位状态字wait()
系统调用。因此,子流程的退出值实际上是($? >> 8
),以及$? & 127
给出进程终止的信号(如果有),以及$? & 128
报告是否存在核心转储。
此外,如果h错误号
变量在C中受支持,其值通过$?
如果有总*()
功能失败。
如果您已经为安装了信号处理程序SIGCHLD公司
,的值$?
在处理程序之外通常是错误的。
内部结束
子程序$?
包含要给的值退出()
。您可以修改$?
在中结束
子例程更改程序的退出状态。例如:
结束{$? = 1如果$?==255; # 死而复生255}
在VMS下,杂注使用vmsish“状态”
制造$?
反映实际的VMS退出状态,而不是POSIX状态的默认模拟;看见perlvms中的“$?”了解详细信息。
助记符:类似于第页和科什.
- #$蒸发错误
-
- #$@
-
上次的Perl错误评估
运算符,即捕获的最后一个异常。对于eval区块
,这是运行时错误消息或字符串或引用死亡
用调用了。这个评估字符串
表单还捕获语法错误和其他编译时异常。
如果没有出现错误,评估
套$@
到空字符串。
此变量中未收集警告消息。但是,您可以通过设置$SIG{__WARN__}
如中所述“%SIG”.
助记符:错误“at”在哪里?
这些变量提供有关当前解释器状态的信息。
- #$编译
-
- #$^C(美元)
-
与-c(c)开关。主要用于-MO=。。。允许代码在编译时改变其行为,例如自动加载
在编译时而不是正常的延迟加载。设置$^C=1
类似于调用B: :减去c
.
这个变量是在Perl v5.6.0中添加的。
- #$调试
-
- #$^D(美元)
-
调试标志的当前值。可以读取或设置。喜欢它命令行等效项,可以使用数字或符号值,例如。$^D=10
或$^D=“st”
。请参阅"-D类数“在perlrun中。此变量的内容也会影响调试器操作。请参见perldebguts中的“调试器内部”.
助记符:的值-D类开关。
- #${^编码}
-
不再支持此变量。
它过去用来容纳对象引用到编码
对象,该对象用于将源代码转换为Unicode。
它的目的是让您的非ASCII Perl脚本不必用UTF-8编写;这在处理UTF-8编码文本的编辑器普及之前是有用的,但那是很久以前的事了。这导致了一些问题,比如影响了其他模块的运行,造成了普遍的混乱。
如果您需要类似的功能,建议您使用一个简单的源过滤器,例如筛选器::编码.
如果您来到这里是因为您的代码受到某人使用此变量的负面影响,您通常可以通过以下方式解决此问题:
本地${^ENCODING};
在即将开始的函数被破坏时。这将在include函数的执行范围内取消定义变量。
这个变量在Perl 5.8.2中添加,在5.26.0中删除。将其设置为除未定义
在Perl 5.28.0中是致命的。
- #${^全局_阶段}
-
perl解释器的当前阶段。
可能的值为:
- #施工
-
这个Perl解释器*
正在通过perl_构造
。该值主要用于完整性,并通过底层C变量使用PL_相位
。除非解释器的构造完成,否则实际上不可能执行Perl代码。
- #开始
-
这是全局编译时间。这基本上包括开始
在顶级程序编译期间直接或间接从执行的块。
此阶段不称为“开始”,以避免与开始
-块,因为这些块是在任何编译单元的编译期间执行的,而不仅仅是顶级程序。在运行时输入的新的本地化编译时间,例如由构造函数作为eval“使用SomeModule”
不是全局解释器阶段,因此不反映在${^全局_阶段}
.
- #检查
-
执行任何检查
阻碍。
- #初始
-
与“CHECK”类似,但用于初始化
-块,不是检查
阻碍。
- #RUN(运行)
-
主运行时间,即PL_主根
.
- #完
-
执行任何结束
阻碍。
- #破坏
-
全球毁灭。
还要注意,UNITCHECK-块没有值。这是因为它们是针对每个编译单元单独运行的,因此不是全局解释器阶段。
并非每个程序都必须经历每个可能的阶段,但从一个阶段到另一个阶段的转换只能按照上述列表中描述的顺序进行。
Perl代码的所有阶段的示例可以看到:
开始{print“编译时间:${^GLOBAL_PHASE}\n”}初始{print“INIT-time:${^GLOBAL_PHASE}\n”}检查{打印“检查时间:${^GLOBAL_PHASE}\n”}{包打印::阶段;sub新{my($class,$time)=@_;返回祝福\$time,$class;}次级破坏{my$self=班次;打印“$$self:${^GLOBAL_PHASE}\n”;}}打印“运行时:${^GLOBAL_PHASE}\n”;my$runtime=打印::阶段->新建(“词法变量在END之前被垃圾收集”);结束{打印“结束时间:${^GLOBAL_PHASE}\n”}我们的$destruct=打印::阶段->新(“包变量在END之后被垃圾收集”);
这将打印出来
编译时间:START检查时间:check初始化时间:初始化运行时:run词法变量在END:RUN之前被垃圾收集结束时间:end包变量在END:DESTRUCT之后被垃圾收集
这个变量是在Perl 5.14.0中添加的。
- #$^H(美元)
-
警告:此变量仅供内部使用。其可用性、行为和内容如有更改,恕不另行通知。
这个变量包含Perl解释器的编译时提示。在BLOCK编译结束时,此变量的值将恢复为解释器开始编译BLOCK时的值。
当perl开始解析任何提供词法范围的块构造(例如,eval主体、所需文件、子例程主体、循环主体或条件块)时$^H(美元)
已保存,但其值保持不变。块编译完成后,它将恢复保存的值。在保存和恢复其值的点之间,在BEGIN块中执行的代码可以自由更改$^H(美元)
.
此行为提供了词汇范围的语义,并用于,例如严格使用
杂注。
内容应为整数;它的不同位用于不同的实用标志。下面是一个示例:
子add_100{$^H|=0x100}子foo{开始{add_100()}bar->baz($boon);}
考虑执行BEGIN块期间发生的情况。此时,已经编译了BEGIN块,但foo()
仍在编译中。的新值$^H(美元)
因此,只有在foo()
正在编译。
替换开始{add_100()}
块具有:
开始{require strict;strict->import('vars')}
演示如何使用严格的“vars”
实现。下面是相同词汇杂注的条件版本:
开始{要求严格;strict->import('vars')if$条件}
这个变量是在Perl 5.003中添加的。
- #%^小时
-
这个%^H(H)
哈希提供了与$^H(美元)
。这对于实现词汇范围的杂注很有用。请参见珀尔普拉格马。在运行时访问时,所有条目都是字符串化的,因此只能容纳简单的值。例如,这意味着没有指向对象的指针。
将项目放入%^小时
,为了避免与散列的其他用户发生冲突,有一个关于使用哪些密钥的约定。模块应该只使用以模块名称(其主包的名称)和“/”字符开头的键。例如,模块Foo::酒吧
应使用如下键Foo::Bar/baz
.
这个变量是在Perl v5.6.0中添加的。
- #${^OPEN}(打开)
-
由使用的内部变量PerlIO公司.由两部分组成的字符串,由\0
字节,第一部分描述输入层,第二部分描述输出层。
这是应用打开杂注,以及国际奥委会
或天
的选项-C命令行开关和PERL_UNICODE环境变量.
功能接受()
,打开()
,管道()
,读取管道()
(以及相关质量x
和`字符串`
操作员),套接字()
,套接字对()
、和系统打开()
受此变量的词法值的影响。隐式“ARGV”手柄由打开readline()
(或相关<>
和<<>>
操作符)在传递的文件名上也会受到影响(但如果打开则不会标准输入
). 如果未设置此变量,这些函数将按中所述设置默认层PerlIO中的“默认值和如何覆盖它们”.
打开()
使用3个参数调用时忽略此变量(和默认层),并指定显式层。通过以下模块间接调用这些函数IO::句柄不受影响,因为它们出现在不同的词汇范围内。目录句柄,如由打开的opendir()
当前未受影响。
此变量是在Perl v5.8.0中添加的。
- #$PERLDB(美元)
-
- #$^P(美元)
-
用于调试支持的内部变量。各种位的含义可能会发生变化,但目前表明:
- #0x01个
-
调试子程序进入/退出。
- #0x02个
-
逐行调试。原因数据库::DB()
为执行的每个语句调用的子例程。还可以保存源代码行(如0x400)。
- #0x04个
-
关闭优化。
- #0x08个
-
为未来的交互式检查保留更多数据。
- #0x10个
-
保留有关定义子例程的源行的信息。
- #0x20个
-
从单步开始。
- #0x40个
-
报告时使用子例程地址而不是名称。
- #0x80
-
报告转到子例程(&S)
也。
- #0x100个
-
根据评估的编译位置,为评估提供信息丰富的“文件”名称。
- #0x200个
-
根据匿名子例程的编译位置为其提供信息性名称。
- #0x400个
-
将源代码行保存到@{“_<$文件名”}
.
- #0x800
-
保存源代码时,包含不生成子例程的求值。
- #0x1000个
-
保存源时,包括未编译的源。
有些位可能仅在编译时相关,有些位仅在运行时相关。这是一种新机制,细节可能会改变。另请参见珍珠肠.
- #${^TAINT}
-
反映污染模式是打开还是关闭。1表示打开(程序运行时使用-T型),0表示关闭,-1表示仅启用污染警告(即-t吨或-时间单位).
此变量是只读的。
此变量是在Perl v5.8.0中添加的。
- #${^安全_位置}
-
反映此perl是否可以使用安全区域设置操作(当值为1时)(值为0)。如果在没有线程的情况下编译perl,则此变量始终为1。如果这个perl使用的是线程安全的区域设置操作,那么它也是1。注意,单个线程可以通过调用perlapi中的“switch_to_global_locale”。在此类线程中,此变量当前仍设置为1。
此变量是只读的。
此变量是在Perl v5.28.0中添加的。
- #${^UNICODE}
-
反映Perl的某些Unicode设置。请参见珀尔伦文档-C类
切换以获取有关可能值的更多信息。
这个变量是在Perl启动期间设置的,之后是只读的。
这个变量是在Perl v5.8.2中添加的。
- #${^utf8缓存}
-
此变量控制内部UTF-8偏移缓存代码的状态。1表示打开(默认),0表示关闭,-1表示通过检查线性扫描的所有结果来调试缓存代码,并对任何差异感到恐慌。
此变量是在Perl v5.8.9中添加的。它可以随时更改或删除,恕不另行通知,但目前用于避免重新计算多字节UTF-8编码字符的边界。
- #${^UTF8LOCALE}
-
此变量指示perl在启动时是否检测到UTF-8区域设置。当perl处于adjust-utf8ness-to-locale模式时(与-CL公司
命令行开关);看见珀尔伦获取更多信息。
此变量是在Perl v5.8.8中添加的。
#弃用和删除的变量
弃用一个变量表明了perl维护者最终要从语言中删除该变量的意图。尽管它处于状态,但它可能仍然可用。使用弃用的变量会触发警告。
删除变量后,它的使用会触发一个错误,告诉您该变量不受支持。
请参见perldiag公司有关错误消息的详细信息。
- #$#
-
$#
是一个可用于格式化打印数字的变量。在一个弃用周期后,它的魔力在Perl v5.10.0中被移除,现在使用它会触发一个警告:不再支持$#
.
这不是您在数组名称前用来获取最后一个索引的符号,如$#数组
。这仍然是在Perl中获取数组最后一个索引的方法。这两个人彼此无关。
在Perl 5中已弃用。
在Perl v5.10.0中删除。
- #$*
-
$*
是一个可以用于启用多行匹配的变量。经过一个弃用周期后,它的魔力在Perl v5.1.0中被消除了。现在使用它会触发警告:不再支持$*
。您应该使用/秒
和/米
改为regexp修饰符。
在Perl 5中已弃用。
在Perl v5.10.0中删除。
- #$[
-
这个变量存储数组中第一个元素的索引和子字符串中第一个字符的索引。默认值为0,但理论上可以将其设置为1,以使Perl的行为更像awk公司订阅和计算index()和substr()函数时使用(或Fortran)。
从Perl的第5版开始,将$[
被视为编译器指令,不能影响任何其他文件的行为。(这就是为什么您只能为其分配编译时常量。)强烈建议不要使用它。
在Perl v.10.0之前,将赋值给$[
与其他编译时指令(例如严格的). 对其使用local()将其值严格绑定到词法块。现在它总是在词汇上定义范围。
从Perl v5.16.0开始,它由芳基模块。
从Perl v5.30.0或更低版本开始使用v5.16
,或无功能“array_base”
,$[
不再有任何效果,并且始终包含0。允许将0赋值给它,但任何其他值都会产生错误。
助记符:[以下标开头。
在Perl v5.12.0中已弃用。