Perl中的特殊内置变量详细介绍_应用技巧

内置变量 $_:

先来看一个例子:

复制代码 代码如下:

#!/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 1.

$!在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的内容是:
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333
=================================
好,程序的运行结果是:
111111111111111111111111111
#===========================#
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333

程序就不多废话了,作用就是读文件,关键部分在“$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 1 is:111111111111111111111111111
line 2 is:222222222222222222222222222
line 3 is:333333333333333333333333333

可见,变量$.的作用是一个类似计数器的东西,但是,为什么刚开始我说$.会受到$/变量的影响呢 ?

将上面的例子稍做修改,再看一下:

复制代码 代码如下:

$text = "C:\test.txt";
undef $/; # 注意,多加了这一行
open FH,$text or die "can't open:$!";
while () {
 print "line $. is:$_";
}
close FH;

第二行多加了一句undef $/; ,上面已经说过它的作用了,来看一下这段程序运行的结果:

复制代码 代码如下:

line 1 is:111111111111111111111111111
222222222222222222222222222
333333333333333333333333333

本来应该是三行的文本,不但被一次性打印出来,而且还指明了“line 1”(看来程序认为这个文本只有一行),为什么 ?

这是因为$.变量并不是一个单纯的行计数器,确切地说,可以说$.是一个对$/计数器,我们再来看一段程序大概就会明白了:

复制代码 代码如下:

$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 1 is:ddd;
line 2 is:bbb;
line 3 is:ccc;
line 4 is:fff;
line 5 is:eee;

看过这段程序应该就明白了吧。

好,$.已经讲得差不多了,接下来再说一个它的特性,仍然是看程序说话:

复制代码 代码如下:

$text = "C:\test.txt";
open FH,$text or die "can't open:$!";
while () {
 print "line $. is:$_ ";
}
print " ",$.;
close FH;
print " ",$.;

这个程序要注意的是最后三行中的两个print " ",$.;(一个是在关闭文件前,另外一个则是在关闭文件后)。
看一下执行结果:

复制代码 代码如下:

line 1 is:111111111111111111111111111
line 2 is:222222222222222222222222222
line 3 is:333333333333333333333333333
3
0

结果的前三行刚才就已经知道了,这不是我们关心的,我们应该关心的是最后两行结果(即两个print " ",$.;的结果);
$.变量是具有记忆性的(从原理上来将,它是一个包变量),因此,在关闭文件前打印会发现,它的值是还没有变化的(这时的值和最后一次读完文件的值均为3);
而在关闭文件后,该变量又被重新初始化为0了。
这个特性大家注意一下就可以了,因为其中的原理涉及到了perl的作用域和包的一些知识,不是很容易说清楚,所以就不说了,如果对包和作用域有了解的读者对这部分即使我不讲他们也应该能理解的。

内置变量:$^O:

再说最后一个吧

说一个用来简单判断操作系统类型的,看个例子:

复制代码 代码如下:

C:>perl -e "print $^O;";
MSWin32

注意,这里这个特殊变量$^O 最后一个字符是字母O,且大写。
如果是在linux下的话,结果就不是MSWin32了,而是Linux ;
这是一个判断环境的变量,简单实用。

时间: 2024-09-17 04:53:39

Perl中的特殊内置变量详细介绍_应用技巧的相关文章

linux awk 内置变量使用介绍

一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入字段分隔符 默认是空格 NF 当前记录中的字段个数,就是有多少列 NR 已经读出的记录数,就是行号,从1开始 RS 输入的记录他隔符默 认为换行符 OFS 输出字段分隔符 默认也是空格 ORS 输出的记录分隔符,默认为换行符 ARGC 命令行参数个数 ARGV 命令行参数数组 FILENAME 当前输入文件的名字 IGNORECASE 如果为真,则进行忽略大小写的匹配 ARG

Linux下awk内置变量使用介绍

我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念.你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量. 我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念.你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量.awk 内置变量已经有预先定义的值了,但我们也可以谨慎地修改这些值. awk 内置变量包括: FI

Python max内置函数详细介绍_python

Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an iterable or the largest of two or more arguments. If one positional argument is provided, it should be an iterable. The largest item in the it

Webform 内置对象 Session对象、Application全局对象,ViewState详细介绍_应用技巧

Session 每台电脑访问服务器,都有独立的session,key值都一样,内容不一样. 1.session保存在服务器上. 2.session没有持久性,保存周期就是20分钟. 重点: session不要滥用,不要不用,滥用会造成服务器溢出,不用会造成资源浪费. 赋值:Session["key"] = 值: 取值:string a = Session["key"]; 清除: Session["key"]=null;  Application

简析Windows Vista内置防火墙图文教程_应用技巧

早在Windows 2000系统的扩展工具包中就出现了ICF(Internet Connection Firewall)工具,通过它可以配置网络数据包的传入规则,但是在Windows 2000中这个ICF工具没有内置到系统中.因此说起Windows系统自带的防火墙要追溯到XP系统,在XP和XP SP1系统中内置了一个名为Internet Connection Firewall的组件,它提供了基本的包过滤功能,这就是系统防火墙的前身. 到了XP SP2发布后这个ICF就名正言顺地成为了Window

JavaScript中property和attribute的区别详细介绍_基础知识

1. 定义 Property:属性,所有的HTML元素都由HTMLElement类型表示,HTMLElement类型直接继承自Element并添加了一些属性,添加的这些属性分别对应于每个HTML元素都有下面的这5个标准特性: id,title,lang,dir,className.DOM节点是一个对象,因此,他可以和其他的JavaScript对象一样添加自定义的属性以及方法.property的值可以是任何的数据类型,对大小写敏感,自定义的property不会出现在html代码中,只存在js中.

ASP.NET的实用技巧详细介绍_实用技巧

关于ASP.NET的实用技巧,其实我们已经接触到很多了.下面为大家总结一下,供大家参考. 1.跟踪页面执行 设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化.ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="True"属性即可: <%@ Page Language="C#" Trace="true"> 跟踪信息可以分为两类: a.页面执行详细情况 其中主要包括

WPF的数据绑定详细介绍_实用技巧

一.WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改. 例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改. 1. 数据绑定涉及到两个方面: 一个是绑定源,一个是绑定目标.绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件. 2. 对

UTF-8编码问题BOM详细介绍_应用技巧

今天在写php代码的时候,出现一个特郁闷的问题那就是两个一模一样的文件,在IE下显示有一个文件却出显了一个空白行,如地址所示http://www.kuomart.com/blog/my_ex/bom_utf8.htm以上出现空白行的页面是用php的require('t.htm')导入模板输出的,而我的php文件和htm文件都是用的记事本写的,然后保存为utf-8编码的,这样之后就出现了用nodepad保存utf8文件自动添加bom到文件的开始,起先自己测试用nodepad,dw,edplus打开