Perl中的特殊内置变量详解

时间:2022-05-05 22:38:04
#!/usr/bin/perl -w
@array = qw(a b c d);
foreach (@array) {
print $_," ";
}
例子的作用就是定义一个数组并把其中的元素打印出来,这里需要注意的是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程序,作用就是打印出一段话:print qq(The PID of process perl.exe is : $$) ,在这里,存在着特殊变量$$ ;
$$是当前perl解析器的进程ID(即,PID),大家可以将在段程序写在命令行上,该程序会在perl解析器运行5秒后打印出perl解析器的进程ID,大家可以在程序运行期间通过查看进程列表来确定打印结果是否正确。
  接下来是一个用来返回错误信息(或是错误号)的特殊变量。
为了省事,不写程序了,还是来个命令行的吧
perl -e "opendir FH,'c: one' or die qq (can't open:$!);";
这句话就是要打开C盘下的一个none目录(而实际上我的C盘中并没有此目录,之所以这样写的目的就是为了引起一个程序中的错误信息),如果没有打开的话,会执行后面的die qq(can't open:$!)
在这里,$!就指明了错误信息的内容,命令行会返回错误信息:
can't open:No such file or directory at -e line .
$!在open或是opendir中用的比较多(无论是打开文件还是管道或是其他)。   来个例子,说一个有意思的特殊内置变量
$text = "C:\test.txt";
{
open FH,$text or die "can't open:$!";
my $line = ;
close FH;
print $line;
}
print "#===========================# ";
{
undef $/;
open FH,$text or die "can't open:$!";
my $line = ;
close FH;
print $line;
}
=================================
C盘下的test.txt的内容是: =================================
好,程序的运行结果是: #===========================# 程序就不多废话了,作用就是读文件,关键部分在“$line = ”,尖括号操作符(即,<>)作用是读取一行文件内容(相信大多数教程或是书上都是这么写的),但是,这里所说的一行,实际上是有一个标准的,那就是当perl在遇到了换行符后,边认为是一行,而换行符默认情况下是由于$/这个特殊变量定义的,是缺省值。
也就是说,perl 在每次使用<>操作符读文件的时候,会先从$/中获得一个叫做“分隔符”的东西,并以该分隔符为标记来读取文件,如果按默认的$/来说,这个分割符就是一个换行符,所以,默认时,<>操作符才会每次读取一行文本。
在给出的例子中,有这样一句 :undef $/ ,也就是将$/设置为未定义的值,这样一来呢,$/就不再起作用了,因此,大家可以看到,第二次进行同样的操作的时候, <>操作符就不再是只读一行而是将文件内容全部读出来了。   接下来看一个会受到$/影响的内置变量,还是先说实例:
$text = "C:\test.txt";
open FH,$text or die "can't open:$!";
while () {
print "line $. is:$_";
}
close FH;
先来看循环中的:print "line $. is:$_"
程序的作用是读文件,并且,将文件逐行赋值给$_(因为只用了<>操作符而没有指定内赋值变量,因此,默认就是赋值给了$_);
但是这里除了$_,还有一个变量“$.”
我们来看一下结果:
line is:
line is:
line is:
可见,变量$.的作用是一个类似计数器的东西,但是,为什么刚开始我说$.会受到$/变量的影响呢 ? 将上面的例子稍做修改,再看一下:
$text = "C:\test.txt";
undef $/; # 注意,多加了这一行
open FH,$text or die "can't open:$!";
while () {
print "line $. is:$_";
}
close FH;   第二行多加了一句undef $/; ,上面已经说过它的作用了,来看一下这段程序运行的结果:
line is: 本来应该是三行的文本,不但被一次性打印出来,而且还指明了“line ”(看来程序认为这个文本只有一行),为什么 ?
这是因为$.变量并不是一个单纯的行计数器,确切地说,可以说$.是一个对$/计数器,我们再来看一段程序大概就会明白了:
$text = "C:\a.txt";
$/ = ";"; # 注意这里,这里我并将$/设置为未定义,而是给其赋值为分号
open FH,$text or die "can't open:$!";
while () {
print "line $. is:$_ ";
}
close FH;   再看一下C盘下的a.txt的内容:
ddd;bbb;ccc;fff;eee;
就这么简单了。
看一下运行结果:
line is:ddd;
line is:bbb;
line is:ccc;
line is:fff;
line is:eee;
看过这段程序应该就明白了吧。 好,$.已经讲得差不多了,接下来再说一个它的特性,仍然是看程序说话:
$text = "C:\test.txt";
open FH,$text or die "can't open:$!";
while () {
print "line $. is:$_ ";
}
print " ",$.;
close FH;
print " ",$.;
这个程序要注意的是最后三行中的两个print " ",$.;(一个是在关闭文件前,另外一个则是在关闭文件后)。
看一下执行结果:
line is:
line is:
line is: 结果的前三行刚才就已经知道了,这不是我们关心的,我们应该关心的是最后两行结果(即两个print " ",$.;的结果);
$.变量是具有记忆性的(从原理上来将,它是一个包变量),因此,在关闭文件前打印会发现,它的值是还没有变化的(这时的值和最后一次读完文件的值均为3);
而在关闭文件后,该变量又被重新初始化为0了。
这个特性大家注意一下就可以了,因为其中的原理涉及到了perl的作用域和包的一些知识,不是很容易说清楚,所以就不说了,如果对包和作用域有了解的读者对这部分即使我不讲他们也应该能理解的。   再说最后一个吧
说一个用来简单判断操作系统类型的,看个例子:
C:>perl -e "print $^O;";
MSWin32
注意,这里这个特殊变量$^O 最后一个字符是字母O,且大写。
如果是在linux下的话,结果就不是MSWin32了,而是Linux ;
这是一个判断环境的变量,简单实用。

Perl中的特殊内置变量详解的更多相关文章

  1. nginx内置变量详解-乾颐堂

    nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量.其中,部分预定义的变量的值是可以改变的. $arg_PARAMETER 这个变量值为:GET请求中变量名PARAMETER参数 ...

  2. MYSQL常用内置函数详解说明

    函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值:在整理98在线字典数据时(http://zidian.98zw.com/),有这要一个需求,想从多音字duoyinzi字段值提取第一个拼音 ...

  3. python基础-内置函数详解

    一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii ...

  4. JavaWeb学习----JSP内置对象详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小. >>> abs(-25) 25 >&g ...

  6. Python内置方法详解

    1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名. 可以查看所有的字符串的内置方法,如: 1> count ...

  7. 序列内置方法详解&lpar;string&sol;list&sol;tuple&rpar;

    一.常用方法集合 1.1.string,字符串常用方法 以下举例是python2.7测试: 函数名称 作用 举例 str.capitalize() 字符串第一个字符如果是字母,则把字母替换为大写字母. ...

  8. for循环与内置方法详解

    ''' for循环与内置方法详解 ''' # 循环:重复(按照某种规律的)做一件事情 # lt = [1, 2, 3, 4] # # ind = 0 # # while True: # print(l ...

  9. shell 脚本中常用的内置变量

    在 Bash 解释器中,内置了许多变量,这些变量的功能是解释器自带的,我们在编写shell脚本时如果能灵活的使用它们,对脚本的编写效率以及差错大有帮助, 下面一一介绍这些变量 $FUNCNAME.$L ...

随机推荐

  1. 潭州学院-JavaVIP的Javascript的高级进阶-KeKe老师

    潭州学院-JavaVIP的Javascript的高级进阶-KeKe老师 讲的不错,可以学习 下面是教程的目录截图: 下载地址:http://www.fu83.cn/thread-283-1-1.htm ...

  2. &lbrack;Effective JavaScript 笔记&rsqb;第23条:永远不要修改arguments对象

    arguments对象并不是标准的Array类型的实例.arguments对象不能直接调用Array方法. arguments对象的救星call方法 使得arguments可以品尝到数组方法的美味,知 ...

  3. hdu 2141 Can you find it&quest;

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2141 Can you find it? Description Give you three sequ ...

  4. linux0&period;11下的中断机制分析

    http://orbt.blog.163.com/     异常就是控制流中的突变,用来响应处理器状态中的某些变化.当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用, ...

  5. mvc 的 OutputCache

    有人问.有没有类似asp.net web form 一样的那种标头 缓存 [OutputCache(Duration=1000)]public async Task<ActionResult&g ...

  6. lodash学习资料

    二.Lodash Lodash是一个具有一致接口.模块化.高性能等特性的 JavaScript 工具库.它内部封装了诸多对字符串.数组.对象等常见数据类型的处理函数,其中部分是目前 ECMAScrip ...

  7. Win2003可用序列号&lpar;标准版与企业版&rpar;

    通用性好的win2003序列号: (推荐先用这个里面的)FJ8DH-TQPYG-9KFHQ-88CB2-Y7V3Y GRD4P-FTQQF-JCDM8-4P6JK-PFG7M JD7JX-KCDTH- ...

  8. SAX vs&period; DOM &lpar;Event vs&period; Tree&rpar;

    http://www.saxproject.org/event.html Events vs. Trees(大XML文档用SAX) There are two major types of XML ( ...

  9. iOS-图片浏览器&lpar;字典和plist文件的使用&rpar;

    // //  ViewController.m //  19-图片浏览器 // //  Created by hongqiangli on 2017/7/31. //  Copyright © 201 ...

  10. C&plus;&plus; 操作符new和delete

    参考资料: http://en.cppreference.com/w/cpp/memory/new/operator_new http://en.cppreference.com/w/cpp/memo ...