Perl常用的内置变量
先来一个例子吧
#!/usr/bin/perl
usewarnings;
@array =qw(a b c d);
foreach(@array) {
print$_,”\n”;
}
例子的作用就是定义一个数组并把其中的元素打印出来,这里需要注意的是foreach循环部分,foreach循环的标准格式应该是:
foreach$element (@array){
……
}
其中数组@array将其中的元素依次赋值给$element,但是在上面那个程序中,我并没有这样做,在程序中,我就使用到了perl中内置的一个特殊变量$_ 。
在程序第五行中:foreach(@array) 实际上就是等于 foreach $_(@array),在这里,$_是默认是输入/输出,因此,如果在程序中有类似的没有明确声明的变量位置的时候,就有可能能使用$_代替。
再看另外一个内置变量
perl -e“sleep(5);print qq(The PID of process perl.exe is : $$)”;
这是一句命令行上使用的perl程序,作用就是打印出一段话:printqq(The PID of process perl.exe is : $$) ,在这里,存在着特殊变量$$ ;
$$是当前perl解析器的进程ID(即,PID),大家可以将在段程序写在命令行上,该程序会在perl解析器运行5秒后打印出perl解析器的进程ID,大家可以在程序运行期间通过查看进程列表来确定打印结果是否正确(^_^不会错的)。
接下来是一个用来返回错误信息(或是错误号)的特殊变量
为了省事,不写程序了,还是来个命令行的吧
perl -e“opendir FH,’c:\none’ or die qq(can’t open:$!);”;
这句话就是要打开C盘下的一个none目录(而实际上我的C盘中并没有此目录,之所以这样写的目的就是为了引起一个程序中的错误信息),如果没有打开的话,会执行后面的dieqq(can’t open:$!)
在这里,$!就指明了错误信息的内容,命令行会返回错误信息:
can’topen:No such file or directory at -e line 1.
$!在open或是opendir中用的比较多(无论是打开文件还是管道或是其他)。
来个例子,说一个有意思的特殊内置变量
$text =“C:\\test.txt”;
{
openFH,$text or die “can’t open:$!”;
my $line= ;
closeFH;
print$line;
}
print“#===========================#\n”;
{
undef$/;
openFH,$text or die “can’t open:$!”;
my $line= ;
closeFH;
print$line;
}
=================================
C盘下的test.txt的内容是:
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333
=================================
好,程序的运行结果是:
111111111111111111111111111
#===========================#
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333
程序就不多废话了,作用就是读文件,关键部分在“$line = ”,尖括号操作符(即,<>)作用是读取一行文件内容(相信大多数教程或是书上都是这么写的),但是,这里所说的一行,实际上是有一个标准的,那就是当perl在遇到了换行符后,边认为是一行,而换行符默认情况下是由于$/这个特殊变量定义的,是缺省值。
也就是说,perl在每次使用<>操作符读文件的时候,会先从$/中获得一个叫做“分隔符”的东西,并以该分隔符为标记来读取文件,如果按默认的$/来说,这个分割符就是一个换行符,所以,默认时,<>操作符才会每次读取一行文本。
在给出的例子中,有这样一句:undef $/ ,也就是将$/设置为未定义的值,这样一来呢,$/就不再起作用了,因此,大家可以看到,第二次进行同样的操作的时候,<>操作符就不再是只读一行而是将文件内容全部读出来了。
接下来看一个会受到$/影响的内置变量,还是先说实例:
$text =“C:\\test.txt”;
openFH,$text or die “can’t open:$!”;
while (){
print“line $. is:$_”;
}
closeFH;
先来看循环中的:print“line $. is:$_”
程序的作用是读文件,并且,将文件逐行赋值给$_(因为只用了<>操作符而没有指定内赋值变量,因此,默认就是赋值给了$_);
但是这里除了$_,还有一个变量“$.”
我们来看一下结果:
line 1is:111111111111111111111111111
line 2is:222222222222222222222222222
line 3is:333333333333333333333333333
可见,变量$.的作用是一个类似计数器的东西,但是,为什么刚开始我说$.会受到$/变量的影响呢?
将上面的例子稍做修改,再看一下:
$text =“C:\\test.txt”;
undef$/; # 注意,多加了这一行
openFH,$text or die “can’t open:$!”;
while (){
print“line $. is:$_”;
}
closeFH;
第二行多加了一句undef$/; ,上面已经说过它的作用了,来看一下这段程序运行的结果:
line 1is:111111111111111111111111111
222222222222222222222222222
333333333333333333333333333
本来应该是三行的文本,不但被一次性打印出来,而且还指明了“line 1”(看来程序认为这个文本只有一行),为什么 ?
这是因为$.变量并不是一个单纯的行计数器,确切地说,可以说$.是一个对$/计数器,我们再来看一段程序大概就会明白了:
$text =“C:\\a.txt”;
$/ =“;”; # 注意这里,这里我并将$/设置为未定义,而是给其赋值为分号
openFH,$text or die “can’t open:$!”;
while (){
print“line $. is:$_\n”;
}
closeFH;
再看一下C盘下的a.txt的内容:
ddd;bbb;ccc;fff;eee;
就这么简单了。
看一下运行结果:
line 1is:ddd;
line 2is:bbb;
line 3is:ccc;
line 4is:fff;
line 5is:eee;
看过这段程序应该就明白了吧。
好,$.已经讲得差不多了,接下来再说一个它的特性,仍然是看程序说话:
$text =“C:\\test.txt”;
openFH,$text or die “can’t open:$!”;
while (){
print“line $. is:$_\n”;
}
print“\n”,$.;
closeFH;
print“\n”,$.;
这个程序要注意的是最后三行中的两个print “\n”,$.;(一个是在关闭文件前,另外一个则是在关闭文件后)。
看一下执行结果:
line 1is:111111111111111111111111111
line 2is:222222222222222222222222222
line 3is:333333333333333333333333333
3
0
结果的前三行刚才就已经知道了,这不是我们关心的,我们应该关心的是最后两行结果(即两个print “\n”,$.;的结果);
$.变量是具有记忆性的(从原理上来将,它是一个包变量),因此,在关闭文件前打印会发现,它的值是还没有变化的(这时的值和最后一次读完文件的值均为3);
而在关闭文件后,该变量又被重新初始化为0了。
这个特性大家注意一下就可以了,因为其中的原理涉及到了perl的作用域和包的一些知识,不是很容易说清楚,所以就不说了,如果对包和作用域有了解的读者对这部分即使我不讲他们也应该能理解的。
再说最后一个吧
说一个用来简单判断操作系统类型的,看个例子:
C:\>perl-e “print $^O;”;
MSWin32
注意,这里这个特殊变量$^O最后一个字符是字母O,且大写。
如果是在Linux下的话,结果就不是MSWin32了,而是Linux;这是一个判断环境的变量,简单实用。
perl的内置特殊变量还有很多的,例如常用的还有@_、@ARGV、$ARGV、%INC、%ENV等等,有很多,不可能一一列举了,这里给出一个比较有总结性的列表,是chinaunix上perl社区的一个网友总结的,还算比较全:
$-当前页可打印的行数,属于Perl格式系统的一部分
$!根据上下文内容返回错误号或者错误串
$” 列表分隔符
$#打印数字时默认的数字输出格式
$$Perl解释器的进程ID
$%当前输出通道的当前页号
$&与上个格式匹配的字符串
$(当前进程的组ID
$)当前进程的有效组ID
$*设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
$,当前输出字段分隔符
$.上次阅读的文件的当前输入行号
$/当前输入记录分隔符,默认情况是新行
$:字符设置,此后的字符串将被分开,以填充连续的字段.
$;在仿真多维数组时使用的分隔符.
$?返回上一个外部命令的状态
$@Perl解释器从eval语句返回的错误消息
$[数组中第一个元素的索引号
$\当前输出记录的分隔符
$]Perl解释器的子版本号
$^当前通道最上面的页面输出格式名字
$^A打印前用于保存格式化数据的变量
$^D调试标志的值
$^E在非UNIX环境中的操作系统扩展错误信息
$^F最大的文件捆述符数值
$^H由编译器激活的语法检查状态
$^I内置控制编辑器的值
$^L发送到输出通道的走纸换页符
$^M备用内存池的大小
$^O操作系统名
$^P指定当前调试值的内部变量
$^R正则表达式块的上次求值结果
$^S当前解释器状态
$^T从新世纪开始算起,脚步本以秒计算的开始运行的时间
$^W警告开关的当前值
$^XPerl二进制可执行代码的名字
$_默认的输入/输出和格式匹配空间
$|控制对当前选择的输出文件句柄的缓冲
$~当前报告格式的名字
$`在上个格式匹配信息前的字符串
$’在上个格式匹配信息后的字符串
$+与上个正则表达式搜索格式匹配的最后一个括号
$<当前执行解释器的用户的真实ID
$含有与上个匹配正则表达式对应括号结果
$=当前页面可打印行的数目
$>当前进程的有效用户ID
$0包含正在执行的脚本的文件名
$ARGV从默认的文件句柄中读取时的当前文件名
%ENV环境变量列表
%INC通过do或require包含的文件列表
%SIG信号列表及其处理方式
@_传给子程序的参数列表
@ARGV传给脚本的命令行参数列表
@INC在导入模块时需要搜索的目录列表
$-[0]和$+[0]代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置
源文档 <http://apps.hi.baidu.com/share/detail/22718899>
Perl常用的内置变量相关推荐
- shell学习之常用bash内置变量
常用的Bash内置变量 1 BASH_COMMAND当前执行的命令 2 LINENO显示当前所在行号 /bin/bash echo "this is test about ARG LINEN ...
- Linux学习总结(70)——Bash 脚本中常用的内置变量汇总
一.$FUNCNAME.$LINENO.$PWD FUNCNAME 表示当前函数的名字,作用范围仅限函数中使用,在函数外无值 LINENO 表示当前所在脚本中变量出现在的行号 PWD 表示当前目录, ...
- mysql内置变量_MySQL常用内置变量
MySQL用很多常用的内置变量,掌握这些内置变量后对于我们快速获取当前MySQL的配置有很大帮助,下面就来列举几个常用的变量. 查看当前MySQL版本号信息.show variables like ' ...
- 【Kettle】作业和转换中的内置变量
在作业和转换参数中使用Kettle内置变量,可以更方便的工作.下面是Kettle中常用的内置变量: 变量 描述 Internal.Kettle.Version 这是kettle的版本号,比如4.0.0 ...
- shell--特殊位置参数变量及常用内置变量
1.shell中的特殊位置参数变量 $0:获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径 $n:获取当前执行的shell脚本的第n个参数,n=1..9,当n为0时表示 ...
- jmeter中没有sampler_jmeter(七)-BeanShell常用内置变量和场景
Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...
- 【Smarty】Smarty引用、常用内置变量、判断、循环、JavaScript脚本
在<[Smarty]Smarty的下载.配置与Helloworld>(点击打开链接)说明了Smarty的基本运行方式,这里再进一步说明,Smarty的条件结构.循环结构怎么使用.Sessi ...
- python常用内置函数总结-Python学习教程之常用的内置函数大全
前言 内置函数,一般都是因为使用比较频繁或是元操作,所以通过内置函数的形式提供出来.在Python中,python给我们提供了很多已经定义好的函数,这里列出常用的内置函数,分享出来供大家参考学习,下面 ...
- Maven内置变量说明
Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...
最新文章
- 黄金三月,掌握这些,在六十万iOS程序员中脱颖而出
- linux FTP配置详解
- 02_Jquery_02_元素选择器
- 2019.03.29 NOIP训练 友好国度(点分治+容斥)
- 数学怪兽-法国数学家庞加莱
- shell中的变量与eval(转)
- linux服务器用户组和权限管,linux 用户管理,用户权限管理,用户组管理
- php yii框架连接数据库,Yii 框架使用数据库(databases)的方法示例
- 预测评价系统_「机器学习」一文读懂分类算法常用评价指标
- 5999卖999!是噱头还是颠覆
- 吴恩达机器学习课后作业
- 二级造价师课件网课下载,二级造价工程师考试时间报考条件公布!
- 有线路由器接无线路由器设置方法
- mysql中插入数据时Duplicate entry ‘‘ for key ‘PRIMARY‘的解决方案
- 苹果cmsV10仿优酷模板,最新自适应苹果cms模板
- python避障小车_MicroPython实战:DIY一台会思考的避障车
- java 为什么双亲委派_双亲委派机制及使用原因是什么?
- Windows 解决端口占用
- 计算机网络安全知识征文,2018关于网络的作文50字篇网络安全教育听后感
- 商业逻辑12讲之技术创新的逻辑
热门文章
- ASP.NET 定时发送邮件
- 【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)
- 修复Chrome书签栏图标显示不正常
- SystemUI深度裁剪
- 把树莓派4B配成一台小PC(基础入门)
- JAVA毕设项目医院医护人员排班系统(java+VUE+Mybatis+Maven+Mysql)
- 奇迹Mu分析 - 登陆实现
- java遍历数组最简洁的方法,java遍历数组的方式有哪些?
- python爬虫教学百度云_python爬虫爬取百度网盘-怎么做一个百度网盘搜索引擎
- Android使用百度定位不精确问题