Perl学习笔记4——I/O、文件测试、目录操作

文件句柄的概念

在Perl中,文件句柄就是一个程序与外界文件间的I/O联系的名称,又可以理解为一种通道。即一个文件句柄建立了程序本身与外界某一文件之间的一个专用联系通道,这种联系可以为读取、输出以及其他方式,而文件句柄本身就是这个通道的名称。

在一般程序中,文件句柄名使用全大写裸字,属于Perl标识符。在大型程序中,文件句柄也可以存放在标量变量中,即使用标量变量文件句柄。Perl中保留有六个特殊文件句柄,即:STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT。前三个特殊文件句柄会在下文提及,在给文件句柄命名时,应避开这六个保留名。

文件句柄建立的联系主要有三种:写入、输出和追加输出。写入指从一个外界文件中读入数据到程序中,这种读入可以是分行读入,即每次读取一行文件,也可以是一次性全部读入。

输出又称破坏性输出,指将需要输出的内容输出到该文件句柄指向的文件,并清除这个文件中原有的内容。追加输出又称非破坏性输出,其不会清除原文件中的内容,而是将输出的内容追加到原文件内容之后。输出和追加输出对文件的存在与否均无要求,如果文件不存在,则会创建这样的文件再输出。

打开与关闭文件句柄

open操作符可以打开一个文件句柄,即以文件句柄的方式建立Perl程序与一个外间文件之间的I/O联系。open操作符有双参数写法和三参数写法,一般建议使用更严谨的三参数写法,其三个参数分别为:文件句柄名、操作符号和文件路径。操作符号用来说明文件句柄建立的是哪一种联系,即程序对文件进行的是什么样的操作,这些操作均以一个符号表示。读取、输出和追加输出的符号分别为:‘<’、‘>’和‘>>’, 书写在参数中时,这些符号一般需要以单引号圈引。由于open操作符默认以读取文件方式打开文件句柄,所以需要打开一个这样的文件句柄时,其第二参数,即‘<’可省略。第三参数用于指定外界文件的路径,一般也以单引号圈引。例:

open IN,’D:\1.txt’;     #打开名为IN的文件句柄,其功能为从文件句柄指向的文件读取数据,这里省略了open的第二参数,以默认读取方式打开文件句柄

open OUT,’>’,’2.txt’;    #打开名为OUT的文件句柄,其功能为将数据破坏性输出到所给路径的文件中

close操作符可以用来关闭一个文件句柄。在程序结束时,Perl会自动关闭所有的文件句柄,而使用close会使程序更工整,在大型程序中会提高效率。例:

close IN;

close OUT;   #关闭这两个文件句柄

标量变量中的文件句柄

从Perl 5.6开始,文件句柄可以存放入标量变量中,而不必使用裸字,这种用法一般出现在大型程序中。放入标量变量中的文件句柄不仅拥有文件句柄的功能,也具有一切标量变量拥有的功能。如存入数组,哈希等。标量变量文件句柄与裸字文件句柄用法完全一致,所有使用裸字文件句柄的地方,将裸字替换为一个标量变量即可。例:

open $file,’1.txt’;    #打开$file文件句柄,其功能为读取1.txt中的内容

close $file;         #关闭此文件句柄

die函数与autodie编译指令

使用open操作符打开文件句柄时,并不是每一次操作都能成功打开,有时会遇到一些问题,如没有修改文件的权限等。此时为避免程序继续进行而崩溃,就需要在出现问题时及时关闭程序。

die函数可以立即结束程序并返回一些内容,其在书写上与print类似。这些内容会被送到STDERR(标准错误流,详见下文)并默认输出到屏幕,其常用于文件句柄中。当文件发生错误时,系统会给出一个错误解释,这个解释信息存放在Perl的特殊变量$!中,所以其也可以加入到die函数输出的内容中。

die函数最重要的功能在于其可以立即终止程序而避免崩溃,一般与open操作符连用,如果open失败则执行die。常用的写法有两种,即反义操作符写法和短路操作符写法(关于短路操作符,详见“其他控制结构”)。例:

if(!open IN,’1.txt’){die”Wrong:$!”}       #将open操作嵌入到条件表达式中,再取反,表示如果没有打开成功,则执行die

open OUT,’>’,’2.txt’ ordie”Wrong:$!”;    #这是较为常用的写法,暂不解释

Perl中还提供了更为简单的错误处理方法,即打开autodie编译指令。其可以在程序错误时自动启动die,并输出错误信息。这样的指令省去了每打开一个文件句柄都要书写一次die的繁琐。使用方法为:

use autodie;   #启动autodie编译指令

从5.10开始,autodie编译指令已成为Perl标准库的一部分,所以如果在代码中启用5.10,即可以隐式打开autodie编译指令。用法为:

use 5.010;   #启用Perl 5.10,隐式打开autodie编译指令

真正的行输入操作符与文件的读取

在Perl初步的内容中,已经提到了行输入操作符,即这个概念。事实上,这种写法是使用了标准输入流文件句柄(STDIN)来从键盘读取信息,而真正的行输入操作符,即用于从文件句柄读取文件的操作符,是一对尖括号“< >”,尖括号内是一个打开为读取模式的文件句柄。

当一个文件句柄被打开为读取文件模式后,其就可以放入一对尖括号,即行输入操作符中,用来读取文件。从一个文件中读取数据有两种方式:一种为单行模式读取,即每次读取并返回该文件中的一行数据,并使读取文件的光标移动到下一行开头,用于下一次读取;另一种为列表模式读取,即一次性读取该文件的所有内容并返回一个列表,每一行的数据按次序作为列表的多个元素。显然,当以列表模式读取文件时,所有的文件需要一次性全部读取进一个列表才能进行后续操作,当读取的文件较大时,这样的运作方式会大大降低程序性能。所以一般不推荐这种方式,而应尽量以单行模式读取文件。

在说明后续内容之前,需要介绍defined函数。defined函数可以用于判断某个字符串是否被定义,即其值是否为undef,并返回表示定义与否的布尔值。

在使用文件句柄分行读取文件时,一般可以将读取文件的操作内嵌到while的条件表达式中,使用while循环不断读取每一行的内容,每循环一次,就读取下一行的内容,当读取到文件结尾时,行输入操作符会返回undef,此时跳出while循环。

显然,此时while的条件表达式不能单单使用读取到的文件内容,即行输入操作符返回的内容作为布尔值,因为读取到的内容可能为数字0或字符串0,而这也会被当作布尔假值处理。正确的做法是:以行输入操作符返回的内容是否为undef来判定是否读取到了文件末尾。当没有读取到文件末尾时,行输入操作符都能读取到某些内容,也就是说,行输入操作符不可能返回undef,而只有当读取到了文件末尾,行输入操作符读取不到任何内容时,其才会返回undef,所以行输入操作符的返回值是否为undef是判定行输入操作符是否已经读取到了文件末尾的唯一标准。所以可以通过上文中提到的defined函数来判断读取到的字符串是否为undef,并将其返回值作为最终条件表达式返回的布尔值。

综上所述,可以总结出如下几点:1.将读取模式的文件句柄放入行输入操作符,即一对尖括号中,可以读取文件并返回读取到的内容。2.使用while循环不断分行读取文件。3.将读取到的内容存入标量变量中,供while代码块中操作。4.当且仅当文件句柄读取到文件结尾时,行输入操作符会返回undef,此可作为是否跳出while循环的判断依据。5.使用defined函数判断行输入操作符是否返回undef,即是否读取到文件结尾,如果是,则跳出while循环。如此,可以写出如下示例程序:

open IN,’1.txt’;

while(defined($_=)){print}

上例中,首先使用open操作符打开一个读取模式文件句柄IN。然后使用行输入操作符加文件句柄,即在标量上下文中读取一行文件,并将其赋值给$_。再使用defined函数判断$_是否有定义,如果有,则执行while循环。这一系列读取文件内容的操作在读取文件时十分常见,而其代码却十分繁琐,所以Perl为其提供了简写,即:

while(){print}    #与上文中的写法效果完全一样

直接将含有文件句柄的行输入操作符放入while的条件表达式中,即可执行上文中的一系列读取,赋值与判断操作。这种简写会将读取到的一行内容存入$_中,以供代码块使用。而如果需要去掉换行符,一般的写法是在while循环的第一行对默认变量$_使用。例:

while(){chomp;print}    #对$_去掉换行符再输出

在这种简写中,如果不想把读取到的内容存入$_,而是存入其他变量,则可以这样书写:

while($n=){print$n}   #读取一行内容,并将其存入$n中

特别注意,这种简写只有在上例中的两种写法中才能生效,即放入while的条件表达式中,且条件表达式仅为此。其他任何地方这种简写都不会生效(除了相当于while循环的for循环,详见“其他控制结构”)。而一般情况下,如果需要对文件数据逐行处理,最常见的写法就是使用while循环的这种简写。

在列表上下文中使用行输入操作符时,其会返回一个列表,文件中的每一行数据依次作为列表的一个元素。可以使用chomp操作符去掉每一个列表元素末尾的换行符。一般不推荐这种大大降低性能的用法。例:

chomp(@n=);    #在列表上下文中使用返回一个列表,并赋值给@n。使用chomp去掉每一行末尾的换行符

也可以使用foreach循环对文件句柄返回的列表进行循环迭代。例:

for(){chomp;print}    #对返回的列表进行循环迭代

使用STDIN读取标准输入

STDIN是Perl提供的默认文件句柄之一,在Perl程序启动时,默认文件句柄均会被自动打开,所以不需要额外使用open操作符打开这些文件句柄。

STDIN又称标准输入流,是一个读取模式文件句柄,默认情况下,该文件句柄读取来自用户键盘的输入。STDIN与一般的读取模式文件句柄用法一致,使用行输入操作符围住文件句柄,表示从该文件句柄读取。上文提到,如果需要使用读取模式文件句柄的简写形式,就必须将其放入while的条件表达式中,其他任何写法均无此功能。但由于STDIN读取的是来自键盘的输入,所以一般无需使用这种简写,而可以直接使用自成一行的写法,并可以与chomp连用,即之前已经使用过的用法。例:

chomp($n=);    #使用STDIN文件句柄从键盘读取一行输入,并存入$n中,并去掉结尾的换行符

而如果要使用while简写的写法,也同一般的文件句柄:

while(){print}    #使用STDIN读取一行输入,并存入$_中

在列表上下文中,STDIN会从键盘读取多行输入,并返回一个列表,每一行输入作为列表的一个元素。这也是之前已经使用过的用法。例:

chomp(@n=);    #读取多行输入,去掉每一行的换行符,并存入@n中

钻石操作符与ARGV数组

Perl中提供了一个特殊的用于读取数据的操作符,即钻石操作符“<>”。这个操作符具有多种特殊功能。钻石操作符属于特殊的行输入操作符,其自身的用法和简写与一般的读取模式文件句柄一致,即放入while循环的条件表达式中,并执行一系列操作。

钻石操作符读取的数据来自ARGV数组,即@ARGV中的每一个元素。ARGV数组是Perl内部包含的一个特殊数组,其本质和用法与一般的数组没有区别。在Perl程序开始运行时,调用参数会被存入@ARGV,以供钻石操作符取用。

调用参数,是书写于程序运行的命令行语句之后的,以空格隔开的多个文件路径。在程序开始运行时,这些路径会形成一个列表并存入@ARGV,以供钻石操作符从这些路径读取文件。当有多个文件需要读取时,钻石操作符只会在读取到最后一个文件的结尾时才返回undef,读取完一个文件后,其会自动切换到下一个文件,文件与文件之间不会有任何的间断。例:

1.pl 1.txt 2.txt 3.txt    #(此为命令行语句)启动Perl程序1,调用参数列表为qw/1.txt 2.txt 3.txt/,这个列表会存入@ARGV中

while(<>){print}       #使用while循环读取文件,并存入$_,这里使用了简写。钻石操作符读取的数据来自@ARGV,即会依次读取1.txt,2.txt,3.txt中的数据

如果在命令行中不为程序指定调用参数,则钻石操作符会从标准输入流读取数据,即相当于使用。例:

1.pl              #(此为命令行语句)不为程序指定调用参数

while(<>){print}    #由于无调用参数,钻石操作符会从标准输入流读取数据,即相当于while()

由于@ARGV在程序开始运行时就已经存入了调用参数,所以可以在程序开始运行后,且还未使用钻石操作符时,对@ARGV的内容进行修改,这样就可以无视调用参数,强制在程序中指定读取某些文件。例:

@ARGV=qw/1.txt 2.txt 3.txt/;    #在程序开始运行后对ARGV数组进行重新赋值,从而无视调用参数的内容,强制使钻石操作符读取现在@ARGV中的内容

while(<>){print}                #现在钻石操作符调用的是@ARGV中的三个路径所分别指向的文件

使用文件句柄输出

文件句柄不仅可以用于从外界文件读取数据,也可以用于将数据输出到某一文件。当打开了一个输出模式的文件句柄后,就可以使用这个文件句柄将数据输出到此文件句柄所指向的文件。

print操作符可以用于将数据输出到屏幕。而如果在print操作符与需要输出的内容之间放入一个输出模式文件句柄,就可以将需要输出的内容送到该文件句柄,并输出到该文件句柄所指向的文件。需要注意的是,在代码中print与文件句柄裸字之间需要使用空格隔开以避免歧义,并且无论是否会产生歧义,文件句柄与需要输出的内容之间都必须使用空格隔开。如果没有输出内容,则默认将$_中的内容送到该文件句柄并输出到指向的文件。例:

open O,’>’,’2.txt’;    #打开一个输出模式文件句柄,并指向一个文件

print O “aaa”;       #将字符串中的内容输出到文件句柄指向的文件

print O;           #输出$_中的内容到文件句柄指向的文件

print操作符实质与STDOUT

事实上,print操作符的参数是一个列表,print会读取参数列表中的所有元素,并依次无缝输出。当print操作符的参数只是一个标量时,其在列表上下文中会转换为只含有一个参数的列表,并作为print操作符的参数。一般情况下,因不会产生歧义,print操作符后的参数列表括号可省略。例:

print’abc’;       #仅有的一个参数在列表上下文中转换为(’abc’)

print’a’,’b’,’c’;    #依次输出这个列表中的三个元素,列表括号省略

事实上,如果不为print操作符指定一个输出模式文件句柄,其就会默认将需要输出的内容输出到标准输出流,即STDOUT。这是Perl的特殊文件句柄之一,是一个指向用户屏幕的输出模式文件句柄,在程序开始运行时会被自动打开。所以print$n就相当于print STDOUT $n。

select操作符

上文中提到,如果不为print操作符指定输出用文件句柄,其就会默认将需要输出的内容送到STDOUT并输出到屏幕,这是Perl默认的输出用文件句柄。而select操作符可以用来改变Perl默认的输出用文件句柄。例:

open O,’>>’,’2.txt’;    #以追加写入模式打开一个文件句柄

select O;            #将Perl默认的输出用文件句柄改为O

print”abc\n”;        #此时,print会将需要输出的内容送到现在的默认输出用文件句柄O并输出

需要注意的是,select更改的是Perl的一个默认值,所以当不再需要向更改后的默认文件句柄输出时,请将程序默认值改回STDOUT,以免对此程序接下来的部分造成影响:

select STDOUT;    #将默认的输出用文件句柄改回STDOUT

特殊变量$^I

上文提到,钻石操作符具有多种特殊功能,除了可以从@ARGV的元素中读取文件,其还可以实现文件的自体修改。即读取一个文件中的数据,对这些数据进行处理,然后将处理过后的数据再覆盖输出到这个文件自身,从而修改了文件本身的内容。

事实上,对文件进行自体修改会经历以下过程:首先,Perl程序会修改这个文件的文件名,在其末尾加上一个拓展名。然后Perl打开一个新的文件,其文件名和原文件一致,由于原文件已经被重命名,所以这样的操作不会与原文件产生冲突。最后,Perl会将数据写入到这个新文件中,而重命名后的原文件便作为备份文件保存。

一般情况下,钻石操作符的这个自体修改功能是关闭的,而这个功能的开关就是Perl的特殊变量$^I。在未赋值前,这个变量的值为undef,而只要对其赋值,就可以打开这个功能。$^I的值就是在原文件的文件名之后增加的拓展名。如果再次将$^I赋值为undef,就可以手动关闭这个功能。所以只需要在调用钻石操作符之前对$^I赋值,就可以对文件进行自体修改,并生成一个备份文件,其文件名就是原文件名加上$^I的值。在启用自体修改功能后,所有的输出操作都会自动改为输出到读取数据的那个文件,无需再打开额外的输出用文件句柄。

在实际操作中,如果将$^I赋值为空字符串,程序是不会运行的。所以不生成备份文件就直接对该文件进行自体修改,这样的操作是不能进行的。例:

$^I=’.bak’;        #对$^I赋值,启动自体修改功能,生成的备份文件的文件名以“.bak”结尾

while(<>){print}    #这时print默认将输出路径改为输出到钻石操作符读取的那个文件

使用printf格式化输出

printf是一个控制能力比print更强的输出用操作符,其可以以一定的格式来控制输出的字符串,如限定宽度,取整等。printf与print一样,也可以为其指定一个输出用文件句柄。其参数有两个,第一参数称为格式字符串。格式字符串是一个必须以双引号圈引的,内含转换符号的字符串。转换符号是一类用于限定字符串格式的符号,所有转换符号的基本形式都是百分号加一个小写字母,有的符号中间可以加上数字等字符,从而表示不同的含义。常用的转换符号如下:

%s    #最常用的转换符号,用于设定字段宽度

%d    #十进制取整

%f    #以四舍五入的方式限定小数位数,也可限定全字段宽度

printf的第二个参数是一个列表,这个列表中的每一个元素就像填空一样,会分别以其对应的转换格式,被依次替换进格式字符串中每一个转换符号所在的位置,从而最终形成用来输出的字符串并输出。此列表的括号常可省略。列表元素的个数必须与格式字符串中转换符号的数目一样多,否则将出现错误。例:

printf”%d %d”,1.1,2.1;    #逗号前为格式字符串,内含两个取整转换符,用于依次替换第二参数列表中的元素,并将其内容取整。所以第一个%d会被替换为取整后的1,第二个会被替换为2,最终输出的字符串就是“1 2”

%s可以通过前置空格的方式将多个输出字段右对齐,即通过添加若干前置空格的方式来补齐对输出字段限定的宽度。限定的宽度数书写在%与s之间。例:

for(qw/fred barney/){printf”%10s\n”,$_}    #将列表中每个元素均以10个字符宽度输出,用若干前置空格补足需要的字符串宽度,从而实现右对齐。用“`”代替空格,则输出的结果为:““““fred\n““barney\n”

如果输出的字符串宽度已超出限定宽度,则当前字符串的限定宽度会自动延长至该字符串长度,而不会破环字符串内容。例:

printf”%2s”,fred;    #自动将此字符串的限定宽度延长至4,输出的内容为“fred”(不会删减字符串内容以满足限定宽度2)

限定宽度也可以使用负数,这时会对字符串添加后置空格以满足限定宽度,从而可以实现字符串左对齐。例:

printf”%-10sl”,fred;    #限定宽度为10个字符,并使用左对齐。输出字符串为:“fred“““l”

%f可以根据给定条件来限定输出数字的全字段宽度和小数位数。加在%与f之间的数字可以为一个浮点数。浮点数的整数部分用于限定全字段宽度,其用法与上文中的%s完全一致。小数部分用于限定小数位数。全字段宽度服从于小数位数,即如果因小数位数而超出全字段宽度,则全字段宽度自动延长至当前宽度。

如果省略浮点数的整数部分,即只有小数点和小数部分时,表示不限定全字段宽度。而如果省略浮点数的小数部分而保留小数点时,小数部分会被当作0,即进行四舍五入的取整。所以“%.f”这样的写法就表示不限定全字段宽度且进行四舍五入的取整。而如果将这个浮点数改为一个整数,则小数位数恒定为6位,这个整数用于限定全字段宽度,并服从于6位的小数位数。

printf”%.f\n”,1.8;       #不限定全字段宽度的四舍五入取整,输出2

printf”%5.f\n”,1.8;      #限定全字段宽度为5并取整,输出““2

printf”%.5f\n”,1.8;     #不限定全字段宽度,限定5位小数位数,输出1.80000

printf”%10.5f\n”,1.8;    #限定全字段宽度为10,且小数位数为5,输出“`1.80000

printf”%10f\n”,1.8;      #小数位数恒定为6位,限定全字段宽度为10,输出“1.800000

在使用printf输出时,如果需要在格式字符串中输出真正的百分号,则应使用“%%”而不是“\%”。例:

printf”%%%d”,1.1;    #输出“%1”

如果使用一个数组作为printf的第二参数,因为转换符号的数量必须与数组中元素的个数相同,所以可以使用一些技巧动态增减转换符号的数量。例:

printf’The number are:’.(“%d”x@n),@n;   

上例中,首先使用x操作符重复连接多个格式字符串,连接的次数取决于@n在标量上下文中的返回值,即数组中元素的数量,使用括号确定这一操作的优先级。然后将x操作符连接过的字符串再与前面的字符串相连接,作为printf的第一参数,而第二参数则是@n在列表上下文中展开所形成的列表。这里在同一语句中同时使用到了@n在标量上下文和列表上下文中的返回值,上下文的灵活运用由此可见。

使用say输出

say操作符是Perl 5.10的新功能,所以当使用say时,需要启用Perl 5.10。say操作符的绝大多数操作均与print一致,其参数是一个列表,默认输出到STDOUT,可以使用select操作符改变默认的输出用文件句柄,也可以为say指定一个输出用文件句柄。say与print唯一的一个不同点在于:say会自动地在输出内容的末尾加上一个换行符,这对于一些需要加上末尾换行符的输出将十分简便。需要注意的是,say只会在输出完所有内容后才会加上一个换行符,即如果say的参数是一个列表,那么say会依次输出所有的列表元素,当全部输出后,再加上一个末尾换行符。例:

use 5.010;    #启用Perl 5.10

say’abc’;     #相当于print“abc\n”;

say’a’,’b’,’c’;    #与上一行的代码功能一致

say O;       #为say指定一个输出用文件句柄O,并默认输出$_中的内容

文件句柄的重打开与重定向

如果使用open操作符打开一个先前已经打开的文件句柄,这样的操作就称为文件句柄的重打开。当重打开一个文件句柄时,Perl会先自动关闭先前已经被打开的这个文件句柄,然后再重新打开,执行此次的open操作。

open操作符可以用来指定文件句柄指向的文件,而如果重打开一个文件句柄,就可以再次为这个文件句柄指向另一个文件,这样的操作就称为文件句柄的重定向。在重定向过程中,如果定向失败,那么文件句柄就会重新定向回原来的文件。也就是说,文件句柄只有在重定向成功时,才会解除和原文件的对应关系。

下文以STDERR为例,说明文件句柄的重定向。STDERR即标准错误流,是Perl默认文件句柄之一,在Perl程序启动时会被自动打开。Perl程序运行时产生的错误信息,如die函数产生的信息等,都会被送到STDERR并输出到屏幕。所以可以在程序中通过重打开并重定向STDERR,将错误信息输出到用户指定的文件中。例:

open STDERR,’>>’,’err.txt’;    #重新打开STDERR文件句柄,并将其以追加写入模式重定向至err.txt文件,这之后所有的错误信息都会追加写入err.txt文件中,而不是从屏幕输出

文件测试的概念与应用

Perl程序对一个文件的操作不光只是读取和写入,也可以从一个文件中获取一些测试信息,如该文件是否存在,是否可读,可写,可执行等。这样的测试操作就称为文件测试。

Perl提供了一套完整的文件测试操作符以供文件测试使用。文件测试操作符均以连接符加一个字母构成。大多数文件测试操作符返回布尔值,可以用在布尔上下文中,也有的操作符会返回特定数据。常用的文件测试操作符如下:

-e     #文件是否存在

-r     #文件是否可读

-w    #文件是否可写

-x     #文件是否可执行

文件测试操作符的参数就是文件路径。常可以使用在布尔上下文中。例:

if(-e’1.txt’){print’T’}else{print’F’}    #测试1.txt是否存在

虚拟文件句柄与栈式写法

如果需要对同一文件做多项测试,可以多次使用操作符+参数的形式进行书写,但这种写法在实际运行中会导致重复操作,在文件较多时会大大降低程序性能,且书写也不方便。所以Perl提供了一种特殊的简写来避免这种重复操作,即虚拟文件句柄“_”。当再次测试同一文件的其他属性时,可以使用虚拟文件句柄“_”告诉Perl使用上一次测试的文件进行测试。例:

if(-e’1.txt’){

      if(-w_){print’T’}else{print’F’}    #这里的“_”就表示文件1.txt

}

在Perl 5.10之后,如果需要对一个文件进行多项测试,还可以使用更简便的写法,即栈式写法。这种写法允许将多个文件测试操作符一起写在需要测试的文件前,以空格隔开,从而同时执行多项测试操作。测试的顺序遵循从右向左,即最靠近参数的操作符最先进行测试,再逐个向左进行测试。在均返回布尔值的操作符之间,测试次序的先后对结果没有影响。例:

if(-w -r -e’1.txt’){print’T’}    #同时测试1.txt是否存在、是否可读、是否可写

程序的相对路径与chdir操作符

每一个文件都有其绝对路径和相对路径。绝对路径指从根目录,即盘符开始索引的路径,而相对路径指从某一相对路径起点开始索引的路径。Perl程序运行时会以命令行的工作目录作为相对路径的起点,如相对路径“1.txt”就是指程序相对路径起点下的文件1.txt。windows中有一些办法可以改变命令行的相对路径起点。而在Perl中,可以使用chdir操作符改变当前程序的相对路径起点。例:

chdir’D:\\’;   #将当前程序的相对路径起点改为D:\,使用反斜线转义表示真正的反斜线

这样的操作后,如果提到相对路径文件“1.txt”,就是指绝对路径为“D:\1.txt”的文件。由此可见,使用chdir操作符修改相对路径后,就可以使后续代码沿用此相对路径起点,从而省去书写绝对路径的麻烦。

樱雨楼

完成于2016.1.7

最后修改于2016.1.28

    原文作者:樱雨楼
    原文地址: https://www.jianshu.com/p/4798adc9fbf3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞