第十一章 文件系统

上一篇 / 下一篇  2009-01-08 23:03:21 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

第十一章  文件系统51Testing软件测试网z,Q kA(g5b

    本章所讲的函数多数使用了UNIX操作系统的特性,在非UNIX系统中,一些函数可能没有定义或有不同的工作方式,使用时请查看Perl联机文档。51Testing软件测试网'E(V1tXE9[&]
一、文件输入/输出函数
2| K8QaTw{Y0    本节讲述从文件中读取信息和向文件写入信息的内置库函数。
%?^ l Jg(ub;d01、基本I/O函数51Testing软件测试网H+BgsO+XX ST
    一些I/O函数在前面的章节中已有讲述,如
nMtKgmFl&PZ051Testing软件测试网'?yR1U Jj

  • open:允许程序访问文件
  • close:终止文件访问
  • print:文件写入字符串
  • write:向文件写入格式化信息
  • printf:格式化字符串并输出到文件
51Testing软件测试网n,O'g4jn!R

    这里简单回顾一下,再讲一些前面未提到的函数。51Testing软件测试网+z3f2A5o"w(P8s
1)open函数51Testing软件测试网l.MFN q1Y)ZKI%|f
    open函数将文件变量与某文件联系起来,提供访问文件的接口,例如:open(MYVAR, "/u/file"); 如果文件打开成功,则返回非零值,否则返回零。缺省地,open打开文件用以读取其内容,若想打开文件以写入内容,则在文件名前加个大于号:open(MYVAR, ">/u/file"); 向已有的文件末尾添加内容用两个大于号:open(MYVAR, ">>/u/file"); 若想打开文件作为数据导向的命令,则在命令前加上管道符(|):open(MAIL, "|mail dave");51Testing软件测试网c*CwnNxBR
2)用open重定向输入
(Cz6oJ:f*p S1anO*v0    可以把打开的文件句柄用作向程序输入数据的命令,方法是在命令后加管道符(|),如:51Testing软件测试网0]}|Ft
    open(CAT, "cat file*|");51Testing软件测试网Ws_ioH
    对open的调用运行命令cat file* ,此命令创建一个临时文件,这个文件的内容是所有以file打头的文件的内容连接而成,此文件看作输入文件,可用文件变量CAT访问,如:
iW9i-m.^D'rG0    $input =;
zyF*^QN ew }XY0    下面的例子使用命令w的输出来列出当前登录的所有用户名。51Testing软件测试网V;p/J-n.DW ql R\8B ~

BgS KG(QT0a0

'm*I7@1E'Bh-ox01 : #!/usr/local/bin/perl
2IMD pD6T9M02 :51Testing软件测试网!d.i)[k"d
3 : open (WOUT, "w|");51Testing软件测试网 c6p/on!^%N:e9P
4 : $time = <WOUT>;
s.az3k G'K#^"}.m05 : $time =~ s/^ *//;
d9mQY$\4O {VI*N06 : $time =~ s/ .*//;
&Kj8L%CBY,JS:[07 :; # skip headings line51Testing软件测试网 ooE%{9}.H
8 : @users =;
,?(P$I8e@*v:N*| m09 : close (WOUT);51Testing软件测试网Q%_3O[T8gI
10: foreach $user (@users) {
qQ-jc Of$[011:   $user =~ s/ .*//;51Testing软件测试网g8O+e,sNVh
12: }
q*q(C&`W t/Q&hz,ij013: print ("Current time: $time");51Testing软件测试网*R_#adbn_^
14: print ("Users logged on:\n");
h L,T}9t3T;t$j015: $prevuser = "";
.U*~H0u ^5E_%e1L!LK016: foreach $user (sort @users) {51Testing软件测试网Q+m%K#L!s7jwc
17:   if ($user ne $prevuser) {
\7Ad x"_t9Q/s8r018:     print ("\t$user");51Testing软件测试网UQ`3cP8i&H3}`4i!A"m
19:     $prevuser = $user;
$E%g v7P%^cp o020:   }51Testing软件测试网w8eGy^P i
21: }51Testing软件测试网"UY+e7{}

51Testing软件测试网"k"_0Y2S,S*F? O1@%ol

    结果输出如下:51Testing软件测试网.b8y O,uf"C`8t`1y

(` X_tX'g'PI;y/Q0]*a0
51Testing软件测试网pyy'{%z1m(Ja

Current time: 4:25pm51Testing软件测试网 m-_JOHU%\v _
Users logged on:51Testing软件测试网FH3a6} If x$R
  dave
$BS#q&|U`!J |V0  kilroy51Testing软件测试网} u\ GI)z;m;_w&q)M!M
  root
3f.N:lRiXm(M@/Y0  zarquon

|k1bW5f+a5iI+B0

p1K%{ d2N:W*t v'j0    w命令列出当前时间、系统负载和登录的用户,以及每个用户的作业时间和当前运行的命令,如:51Testing软件测试网Ut"TH*H;UU,o$[

d$T-^&I'a.EMy9_0
4:25pm  up 1 day,  6:37,  6 users,  load average: 0.79, 0.36, 0.28
User     tty       login@  idle   JCPU   PCPU what
dave     ttyp0     2:26pm           27      3 w
kilroy   ttyp1     9:01am  2:27   1:04     11 -csh
kilroy   ttyp2     9:02am    43   1:46     27 rn
root     ttyp3     4:22pm     2               -csh
zarquon  ttyp4     1:26pm     4     43     16 cc myprog.c
kilroy   ttyp5     9:03am         2:14     48 /usr/games/hack
51Testing软件测试网X0p5f*V1V,ml

    上例中从w命令的输出中取出所需的信息:当前时间和登录的用户名。第3行运行w命令,此处对open的调用指定w的输出用作程序的输入,用文件变量WOUT来访问该输入。第4行读取第一行信息,即:51Testing软件测试网 Fx3J6kV8iz
    4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.2851Testing软件测试网 [1G1l1ad)x0Wlo
    接下来的两行从这行中抽取出时间。首先,第5行删除起始的空格,然后第6行删去除时间和结尾换行符之间的所有字符,存入变量$time。51Testing软件测试网 Rj\M2gSJ-N
    第7行从WOUT读取第二行,这行中无有用信息,故不作处理。第8行把剩下的行赋给数组@users,然后第9行关闭WOUT,终止运行w命令的进程。
/SS4gt k0    @users中的每个元素都是一行用户信息,因为本程序只需要每行的第一个单词,即用户名,故10~12行去掉除换行符外的其它字符,这一循环结束后,@users中只剩下用户名的列表。
-gZ(jCP+E3z0    第13行输出存贮在$time中的时间,注意这时print不需要加上换行符,因为$time中有。16~21行对@users中的用户名排序并输出。因为同一个用户可以多次登录,所以用$preuser存贮输出的最后一个用户名,下次输出数组元素$user时,如果其与$preser相等,则不输出。
jm5i3}8HV03)文件重定向51Testing软件测试网_w3_.} c@"K
    许多UNIX shell可以把标准输出文件(STDOUT)和标准错误文件(STDERR)都重定向到同一个文件,例如在Bourne Shell(sh)中,命令
czC;_Eq\V0    $ foo > file1 2>&1
(bF]_r$J+_;p0    运行命令foo并把输出到标准输出文件和标准错误文件的内容存贮到文件file1中。下面是用Perl实现这一功能的例子:51Testing软件测试网g"VHE?GYp;L
51Testing软件测试网:p%eOU\-r{

51Testing软件测试网)Rut#RqTW-X

1: #!/usr/local/bin/perl
$wrf ? DXY/A02:51Testing软件测试网n\3g+v,hNx+}
3: open (STDOUT, ">file1") || die ("open STDOUT failed");51Testing软件测试网|Q H{S.E
4: open (STDERR, ">&STDOUT") || die ("open STDERR failed");51Testing软件测试网SpHBKsF9i Of
5: print STDOUT ("line 1\n");
0HW^D$E S h&f06: print STDERR ("line 2\n");51Testing软件测试网Zz&Kcm |"U
7: close (STDOUT);
.JD#GC}08: close (STDERR);51Testing软件测试网 f"s%y.D)i-Y S-p0[$o

51Testing软件测试网3Zze+AgA{vd9L:{

    运行后,文件file1中的内容为:
8A:d(q8qq9]d0     line 2
]K]o2P;c:K0     line 151Testing软件测试网/aP&DFb&C\
    可以看到,这两行并未按我们想象的顺序存贮,为什么呢?我们来分析一下这段程序。51Testing软件测试网$wTJm*iH{w
    第3行重定向标准输出文件,方法是打开文件file1将它与文件变量STDOUT关联,这也关闭了标准输出文件。第4行重定向标准错误文件,参数>&STDOUT告诉Perl解释器使用已打开并与STDOUT关联的文件,即文件变量STDERR指向与STDOUT相同的文件。第5、6行分别向STDOUT和STDERR写入数据,因为这两个文件变量指向同一个文件,故两行字符串均写到文件file1中,但顺序却是错误的,怎么回事呢?
A+ex+Y(DS.{0t;m0    问题在于UNIX对输出的处理上。当使用print(或其它函数)写入STDOUT等文件时,UNIX操作系统真正所做的是把数据拷贝到一片特殊的内存即缓冲区中,接下来的输出操作继续写入缓冲区直到写满,当缓冲区满了,就把全部数据实际输出。象这样先写入缓冲区再把整个缓冲区的内容输出比每次都实际输出所花费的时间要少得多,因为一般来说,I/O比内存操作慢得多。51Testing软件测试网?e+~!hd
    程序结束时,任何非空的缓冲区都被输出,然而,系统为STDOUT和STDERR分别维护一片缓冲区,并且先输出STDERR的内容,因此存贮在STDERR的缓冲区中的内容line 2出现在存贮在STDOUT的缓冲区中的内容line 1之前。51Testing软件测试网'xH4B&z)_!X@
    为了解决这个问题,可以告诉Perl解释器不对文件使用缓冲,方法为:51Testing软件测试网eC:uu;?U
     1、用select函数选择文件51Testing软件测试网t[E%B V;j"H9S
     2、把值1赋给系统变量$|51Testing软件测试网@7Gd R Dk
    系统变量$|指定文件是否进行缓冲而不管其是否应该使用缓冲。如果$|为非零值则不使用缓冲。$|与系统变量$~和$^协同工作,当未调用select函数时,$|影响当前缺省文件。下例保证了输出的次序:
z+n9b9d6Y'L$n051Testing软件测试网 H U.@1x@m*}

51Testing软件测试网 Ji(l[3P G-J!m1]lW

1 : #!/usr/local/bin/perl
ynadOhy5sw.g02 :
f@^9N9d H03 : open (STDOUT, ">file1") || die ("open STDOUT failed");51Testing软件测试网4okk`.u_{A
4 : open (STDERR, ">&STDOUT") || die ("open STDERR failed");
dXW B]RL)Z05 : $| = 1;51Testing软件测试网k9NUBLXc+f
6 : select (STDERR);
O~;h$M&[ Lb07 : $| = 1;51Testing软件测试网-~#sif^ ns+Z&B$\
8 : print STDOUT ("line 1\n");
LkU;iE;eE*nJ09 : print STDERR ("line 2\n");51Testing软件测试网/m vO,zn%O
10: close (STDOUT);
~LSU7Kc,_ f8D P011: close (STDERR);51Testing软件测试网&H1F5j8N-kX:jW'J

51Testing软件测试网;SX)vS8T/^

    程序运行后,文件file1中内容为:51Testing软件测试网v3p-@~t6Qm
     line 151Testing软件测试网(n {M Jx+hrDK6}vb
     line 2
Y2|1@&T5lvN0    第5行将$|赋成1,告诉Perl解释器当前缺省文件不进行缓冲,因为未调用select,当前的缺省文件为重定向到文件file1的STDOUT。第6行将当前缺省文件设为STDERR,第7行又设置$|为1,关掉了重定向到file1的标准错误文件的缓冲。由于STDOUT和STDERR的缓冲均被关掉,向其的输出立刻被写到文件中,因此line 1出现在第一行。51Testing软件测试网/Q)y3u4F.b,Y}a
4)指定读写权限51Testing软件测试网 Ep*^4H,SZ
    打开一个既可读又可写的文件方法是在文件名前加上"+>",如下:
}TP(yzD)a7U-e a2j0     open (READWRITE, "+>file1");51Testing软件测试网N%O*A-e.q$K:@A
    此语句打开既可读又可写的文件file1,即可以重写其中的内容。文件读写操作最好与库函数seek和tell一起使用,这样可以跳到文件任何一点。
[9H3xfG%B0t8L0    注:也可用前缀"+<"指定可读写权限。
V9E,nY8J(_-L05)close函数51Testing软件测试网 GE{lo,?w5^
    用于关闭打开的文件。当用close关闭管道,即重定向的命令时,程序等待重定向的命令结束,如:51Testing软件测试网 z-m"R cXeph
     open (MYPIPE, "cat file*|");51Testing软件测试网/uN"q.l\ zYd*F
     close (MYPIPE);51Testing软件测试网] } |&x&o/g:AX
    当关闭此文件变量时,程序暂停运行,直到命令cat file*运行完毕。
5y3_ KN9Jg5B8?k5]06)print, printf和write函数51Testing软件测试网VuD s;~
    print是这三个函数中最简单的,它向指定的文件输出,如果未指定,则输出到当前缺省文件中,如:
n o A&JS'j)uy/g6w p0     print ("Hello, there!\n");51Testing软件测试网v5k q8J9f W)y
     print OUTFILE ("Hello, there!\n");
,g`/d+l/C`,E(W0    第一句输出到当前缺省文件中,若未调用select,则为STDOUT。第二句输出到由文件变量OUTFILE指定的文件中。
G9sy x'fhO0    printf函数先格式化字符串再输出到指定文件或当前缺省文件中,如:51Testing软件测试网(U8P2QgC$de7D
     printf OUTFILE (“You owe me %8.2f", $owing);51Testing软件测试网9]/QT cXQj(q
    此语句取出变量$owing的值并替换掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮点数。
2X{(J5n aEz0    write函数使用输出格式把信息输出到文件中,如:
"}flNKCmtJN0     select (OUTFILE);51Testing软件测试网 a{ v)PT
     $~ = "MYFORMAT";
*W,k;zfk0     write;
`,y%fK;p8_;A0    关于printf和write,详见《第x章 格式化输出》。51Testing软件测试网#C H x f3y\ e^
7)select函数51Testing软件测试网T+?2H ]2zm$c.g
    select函数将通过参数传递的文件变量指定为新的当前缺省文件,如:
0V&^.c c;pQ0     select (MYFILE);51Testing软件测试网2| Ib[4S:^-x+o\
    这样,MYFILE就成了当前缺省文件,当对print、write和printf的调用未指定文件时,就输出到MYFILE中。51Testing软件测试网NM+b;PCm b
8)eof函数51Testing软件测试网z+[g$tC]d-X3L3o
    eof函数查看最后一次读文件操作是否为文件最后一个记录,如果是,则返回非零值,如果文件还有内容,返回零。51Testing软件测试网7s$w(e L k7fq
    一般情况下,对eof的调用不加括号,因为eof和eof()是等效的,但与<>操作符一起使用时,eof和eof()就不同了。现在我们来创建两个文件,分别叫做file1和file2。file1的内容为:
vu)mE7C#o"T0     This is a line from the first file.
6C&FNon&hS0     Here is the last line of the first file.
^&aGH9u6]O0    file2的内容为:
&e(zf/a"Cu$o0     This is a line from the second and last file.
-P&o DTC\0     Here is the last line of the last file.
C.Sm.{$@p7f J0    下面就来看一下eof和eof()的区别,第一个程序为:51Testing软件测试网 Dd9` qa6KCZF Q"K7};C
51Testing软件测试网-P$B{:C4sz@w

51Testing软件测试网)es"trk

1: #!/usr/local/bin/perl
3}&RF!y4w02:51Testing软件测试网5J/o/QEnC
3: while ($line = <>) {51Testing软件测试网 _;n3w WAl.?I
4:   print ($line);
$A*^-XH4@/D&}05:   if (eof) {51Testing软件测试网;y2[ rl Tyy JM6YX-A
6:     print ("-- end of current file --\n");
6r*}~7X.l*J07:   }51Testing软件测试网?h@ UO?d-`R,QD2W
8: }

6FA_t4eS*f0

|e4b X&_0    运行结果如下:
B&K P:i_#l5^ k051Testing软件测试网oN vE_/Yy1]4O2I-ZD

R2h0W D? l+}0$ program file1 file2
f${2W,]2]J/X`$m0This is a line from the first file.51Testing软件测试网Z[ur5z;p!ze
Here is the last line of the first file.51Testing软件测试网2T:SIR-`$H7Kz
-- end of current file --51Testing软件测试网n l ~ as V!NI3fl
This is a line from the second and last file.51Testing软件测试网 G6A/lEr DZ.q+C
Here is the last line of the last file.51Testing软件测试网f9e1ntsN
-- end of current file --51Testing软件测试网DF;q ghVK0p*JM
$51Testing软件测试网%|y lDeWZ1o

51Testing软件测试网 r"cT/\&@"a(H

    下面把eof改为eof(),第二个程序为:
6nF$BC/P~%yc%k051Testing软件测试网-\`^/Ez-Hmi

5s a y_!qt01: #!/usr/local/bin/perl
AMt!yY&N3JP02:
/{:a-Ft'^03: while ($line = <>) {
}@BB7z0Z04:   print ($line);51Testing软件测试网^-\ ~7L(C&]8O:[+cI
5:   if (eof()) {51Testing软件测试网/Fz,Oi:A!n;q.p#Xb
6:     print ("-- end of output --\n");
7rXJwkCX07:   }
*e Jm-S\?C+S/X7_08: }

-Y1jd+K2U;wy0

W q3in&VP'r \0    运行结果如下:51Testing软件测试网 `-sgP7I/b9D[-{[S

^0F {Y2o#~l"z0
51Testing软件测试网~g]p/y6ld@-G

$ program file1 file251Testing软件测试网.w.RKX W
This is a line from the first file.51Testing软件测试网dK5K&m;d&a
Here is the last line of the first file.
5\ B1g*I4B/TV0This is a line from the second and last file.
M:Y yx.V&j;A\8n0Here is the last line of the last file.
ki4H,dy,DiWB-C y!Bo0-- end of output --$51Testing软件测试网,R#X0@*^{*E(PZI.a

|,~rI1jv P3]0    这时,只有所有文件都读过了,eof()才返回真,如果只是多个文件中前几个的末尾,返回值为假,因为还有要读取的输入。51Testing软件测试网b1}dPviX
9)间接文件变量51Testing软件测试网.lFmO D}/b
    对于上述各函数open, close, print, printf, write, select和eof,都可以用简单变量来代替文件变量,这时,简单变量中所存贮的字符串就被看作文件变量名,下面就是这样一个例子,此例很简单,就不解释了。需要指出的是,函数open, close, write, select和eof还允许用表达式来替代文件变量,表达式的值必须是字符串,被用作文件变量名。51Testing软件测试网] B~?/h z&\ D|I
51Testing软件测试网p{j*n3oa#UH

R"h!Q2B!U6FJ01: #!/usr/local/bin/perl
!G y tqV3f4k:@)U&U02:51Testing软件测试网x&c'Y;]dUx
3: &open_file("INFILE", "", "file1");51Testing软件测试网W m$X'Bac(z
4: &open_file("OUTFILE", ">", "file2");51Testing软件测试网2D)Y y5\ E'S)L}
5: while ($line = &read_from_file("INFILE")) {51Testing软件测试网T2wQ Tj5\i
6:   &print_to_file("OUTFILE", $line);51Testing软件测试网Ls oc` R\:l
7: }
%O'T RSP08:51Testing软件测试网CaE#y5[K8|W;o
9: sub open_file {51Testing软件测试网C$HEluc#Rd
10:   local ($filevar, $filemode, $filename) = @_;
:D&u"@$IMg-p011:51Testing软件测试网,Mx\ GwcX
12:   open ($filevar, $filemode . $filename) ||51Testing软件测试网%]c-C\1f.B pO w3eA
13:     die ("Can't open $filename");51Testing软件测试网u.}6@8F,eX9|
14: }51Testing软件测试网wC4x$C _Ky0n
15: sub read_from_file {51Testing软件测试网Jl-~5PE"V4w(i
16:   local ($filevar) = @_;
,_4E~Q;@0S8O$V017:
C#vQni&vl018:   <$filevar>;51Testing软件测试网#u)Mb;tJ
19: }51Testing软件测试网$^n*t.v(k:L O&@Iw+b
20: sub print_to_file {
^JevtU*?021:   local ($filevar, $line) = @_;
-E^.UpNA022:
}5]Y0{ h b]023:   print $filevar ($line);
t6n nO_ ]@]024: }51Testing软件测试网9}l%[ B&U#`K

51Testing软件测试网u8TV%~ s$P"B z+B7~

 

x8m.m;M1\ oG)f051Testing软件测试网"Nd y1R-b

2、跳过和重读数据
0KPtUOK1r^5J0

"}iw1W ^)K6ZU~0

T_6]D&{,^0 

'T$t2e^4g UW~0
函数名seek
调用语法seek (filevar, distance, relative_to);
解说在文件中向前/后移动,有三个参数:
:nr8x~j:T|01、filevar,文件变量
H,G#X!DF02、distance,移动的字节数,正数向前移动,负数往回移动
6q,h'o3f0_"|P03、reletive_to,值可为0、1或2。为0时,从文件头开始移动,为1时,相对于当前位置(将要读的下一行)移动,为2时,相对于文件末尾移动。51Testing软件测试网H4fO{M2M;["s0L
运行成功返回真(非零值),失败则返回零,常与tell函数合用。

a,HxCo0 51Testing软件测试网MW*U,{:t H

函数名tell
调用语法tell (filevar);
解说返回从文件头到当前位置的距离。51Testing软件测试网| M/htt:Z
注意:51Testing软件测试网%W&[P@wn7Rl
1、seek和tell不能用于指向管道的文件变量。
x+jHZ5ZE`*{2VD h0d02、seek和tell中文件变量参数可使用表达式。

Kr0T{ z:BF0 51Testing软件测试网g,XBk7GK~"L

M'HVn&v8JU(y f@03、系统读写函数51Testing软件测试网c-d1P3h-zH
51Testing软件测试网{8W%QCg!Z ne ?

F(bE`;u R$vT8]v0 51Testing软件测试网|+l"qVxT s

函数名read
调用语法read (filevar, result, length, skipval);
解说read函数设计得与UNIX的fread函数等效,可以读取任意长度的字符(字节)存入一个简单变量。其参数有四个:51Testing软件测试网'lky@n
1、filevar:文件变量51Testing软件测试网!L3XO$_w9n
2、result:存贮结果的简单变量(或数组元素)
7m3[(sDA BK _03、length:读取的字节数51Testing软件测试网5r|3w-\yB#j
4、skipval:可选项,指定读文件之前跳过的字节数。51Testing软件测试网@#` jc3c
返回值为实际读取的字节数,如果已到了文件末尾,则返回零,如果出错,则返回空串。
51Testing软件测试网9@Yg J u K

 51Testing软件测试网-kW,MU8S$d7n

函数名sysread
调用语法sysread (filevar, result, length, skipval);
解说更快的读取数据,与UNIX函数read等效,参数与read相同。

4f8}4\v%]&?4sfr4F*m0 

ADhBz NPNB5m0
函数名syswrite
调用语法syswrite (filevar, data, length, skipval);
解说更快的写入数据,与UNIX函数write等效,参数:51Testing软件测试网J!GU i qwm
1、filevar:将要写入的文件51Testing软件测试网\.^7_eX/`
2、data:存贮要写入数据的变量
zFQ!z!E s JCkF"_03、length:要写入的字节数
*_/i}+\g1A V04、skipval写操作之前跳过的字节数。
51Testing软件测试网1EG+J9TO!LjF\

 51Testing软件测试网(|Xi|Op"[;Y g

51Testing软件测试网%E ax@nV*U-wL[

4、用getc读取字符51Testing软件测试网f!BLaXI/{hp(Y
51Testing软件测试网6r\Tu+|

#D6I n9OR3g?0 51Testing软件测试网 E:tHL/wGeRQ

函数名getc
调用语法$char = getc (infile);
解说从文件中读取单个字符。

i{:z {1T?;j'S dIDx0 

!hf0M;?(VVbB6F0

"KW~8~z#?H05、用binmode读取二进制文件51Testing软件测试网%?`3^F2U7\YD
51Testing软件测试网!oDv/roy1aHG3_1@

-c&U ao8p1D0 

!L.WjM_-rt4V0
函数名binmode
调用语法binmode (filevar);
解说当你的系统(如类DOS系统)对文本文件和二进制文件有所区别时使用。必须在打开文件后、读取文件前使用。

(H)n7t)M`Dc0 

PGtj a3t.M!x0

`c.lvlMx0二、目录处理函数51Testing软件测试网i4?6Nv z-Q/bg[

51Testing软件测试网yd"|eC\e

 

u&[*O;_u#z0
函数名mkdir
调用语法mkdir (dirname, permissions);
解说创建新目录,参数为:51Testing软件测试网4]u#v&Sb G4I+_
1、dirname:将要创建的目录名,可以为字符串或表达式51Testing软件测试网IKM y:H:L0s
2、permissions:8进制数,指定目录的访问权限,其值和意义见下表,权限的组合方法为将相应的值相加。
51Testing软件测试网({t:Rx8[7G3m^

 

2M,]U rH"Z0
权限
4000  运行时设置用户ID  
2000运行时设置组ID
1000粘贴位
0400拥有者读权限
0200拥有者写权限
0100拥有者执行权限
0040组读权限
0020组写权限
0010组执行权限
0004所有人读权限
0002所有人写权限
0001所有人执行权限

/wMKG*ao'M {0 

2y H%} ~5J@M0
函数名chdir
调用语法chdir (dirname);
解说改变当前工作目录。参数dirname可以为字符串,也可以为表达式。

j.paBp;L\Sg VR%[0 

#x4?,H"C K2e5x | m f&y2{0
函数名opendir
调用语法opendir (dirvar, dirname);
解说打开目录,与下面几个函数合用,可查看某目录中文件列表。参数为:51Testing软件测试网jq p7l(PIq jS
1、dirvar:目录变量,与文件变量类似51Testing软件测试网t6m&W cuj4u#_!B,ui
2、dirname:目录名,可为字符串或表达式51Testing软件测试网2H'[w0UD/s!{#k!J
成功返回真值,失败返回假。
b {|5[*~U0注:程序中可用同名的目录变量和文件变量,根据环境确定取成分。
51Testing软件测试网 io+z;z9c&NT6lq

 51Testing软件测试网g'yA5r_%a!R_

函数名closedir
调用语法closedir (mydir);
解说关闭打开的目录。
51Testing软件测试网Pc3s.L+_2L iZ

 

5]#ys0~,^ y'Q0
函数名readdir
调用语法readdir (mydir);
解说赋给简单变量时,每次赋予一个文件或子目录名,对数组则赋予全部文件和子目录名。

s*M2C7m.O!QEX0 51Testing软件测试网(dTHBw)g

函数名telldir
调用语法location = telldir (mydir);
解说象在文件中前后移动一样,telldir和下面的seekdir用于在目录列表中前后移动。
51Testing软件测试网6HO!w'g+s2[W B

 51Testing软件测试网 P}&MQbFJ

函数名seekdir
调用语法seekdir(mydir, location);
解说location必须为telldir返回的值。

(D4u;_`O h"IZ0 51Testing软件测试网W`,J,lX z LK;`$a+yG

函数名rewinddir
调用语法rewinddir (mydir);
解说将读取目录的位置重置回开头,从而可以重读目录列表。
51Testing软件测试网T V jyld'u

 

RUTQ'[PR m'C0
函数名rmdir
调用语法rmdir (dirname);
解说删除空目录。成功则返回真(非零值),失败返回假(零值)。
51Testing软件测试网 Kx?(W_:Y$p[CH+K

 51Testing软件测试网+P{3{-vM!{T h)}

\`%U.@+Qm0三、文件属性函数51Testing软件测试网 I7Fu:y0yeY Zy&F
1、文件重定位函数
N!bT\+]6s#o0

Nf9a e1vk/J8[0

8k8mEGsa.CQ0 51Testing软件测试网+Ps:NA Y[B

函数名rename
调用语法rename (oldname, newname);
解说改变文件名或移动到另一个目录中,参数可为字符串或表达式。
51Testing软件测试网g#Db!f5I-{(WH0i,no3@

 

8k+f9Ay U,Kx@ k0
函数名unlink
调用语法num = unlink (filelist);
解说删除文件。参数为文件名列表,返回值为实际删除的文件数目。
,vPA dr0此函数之所以叫unlink而不叫delete是因为它实际所做的是删除文件的链接。

"IWw\@Gbu+x0 

m{8a_| E7Y0

+] [\{~q$~q]02、链接和符号链接函数51Testing软件测试网%J$D7gC-B1P9k9M%rK!E3l

+bFQs,u051Testing软件测试网S x-Ro#h?g

 

;\'[`'a:x jq'h#~0
函数名link
调用语法link (newlink, file);
解说创建现有文件的链接--硬链接,file是被链接的文件,newlink是被创建的链接。
Cud(jbv ] B*B;y*m0成功返回真,失败返回假。51Testing软件测试网/J!@`iw3j;CG z:v-~
当删除这两个链接中的一个时,还可以用另一个来访问该文件。
51Testing软件测试网6eH.M]v-J

 

g U|2S ~Q~o0
函数名symlink
调用语法symlink (newlink, file);
解说创建现有文件的符号链接,即指向文件名,而不是指向文件本身。参数和返回值同上。51Testing软件测试网gK~"t3d'i5iwF
当原文件被删除(如:被unlinke函数删除),则被创建链接不可用,除非再创建一个与原被链接的文件同名的文件。
51Testing软件测试网jK.bK8l g@U:Fz

 51Testing软件测试网{DN-L8t mG^

函数名readlink
调用语法filename = readlink (linkname);
解说如果linkname为符号链接文件,返回其实际指向的文件。否则返回空串。
51Testing软件测试网AY5y6@0_2F

 

VC_7|3W y+wW1w0

(E hR?F+x8M?$|4x03、文件许可权函数51Testing软件测试网zh1VT {
51Testing软件测试网F;lG1LI!Qf$Z}4M

!s,jL,JMoW { ]0 

[qhB#h V\\0
函数名chmod
调用语法chmod (permissions, filelist);
解说改变文件的访问权限。参数为:51Testing软件测试网xwB'A,v R(f"a
1、permissions为将要设置的权限,其含义见上述mkdir中权限表
8Y ^?['xW.[ Q#v`U02、filelist为欲改变权限的文件列表

$Z PGL]#e nw0 51Testing软件测试网xv Ii4ci,r^0AeD

函数名chown
调用语法chown (userid, groupid, filelist);
解说改变文件的属主,有三个参数:
1}$\ i$X6FkJG01、userid:新属主的(数字)ID号
tXg-F~?\ZN0SD02、groupid:新的组(数字)ID号,-1为保留原组51Testing软件测试网'D-f5I*S6]N&}` SE
3、filelist:欲改变属主的文件列表

)]+f3tD,}2Me3t(g x0 

T"rN0dd0
函数名umask
调用语法oldmaskval = umask (maskval);
解说设置文件访问权限掩码,返回值为当前掩码。
51Testing软件测试网f|#r:s ~BZ|.?

 51Testing软件测试网|,z!_ r wM/NF/ak

)JrN3X)M\S8Ue,g04、其它属性函数51Testing软件测试网p]'T]?

n/y$`1u r051Testing软件测试网J.F+c't)[5b pQv

 51Testing软件测试网 @e+q$ig$p

函数名truncate
调用语法truncate (filename, length);
解说将文件的长度减少到length字节。如果文件长度已经小于length,则不做任何事。其中filename可以为文件名,也可以为文件变量
51Testing软件测试网\;X/BWu*f$A!p t

 51Testing软件测试网6[L7S+hn [Fs

函数名stat
调用语法stat (file);
解说获取文件状态。参数file可为文件名也可为文件变量。返回列表元素依次为:51Testing软件测试网n`8K _]|S
  • 文件所在设备
  • 内部参考号(inode)
  • 访问权限
  • 硬链接数
  • 属主的(数字)ID
  • 所属组的(数字)ID
  • 设备类型(如果file是设备的话)
  • 文件大小(字节数)
  • 最后访问时间
  • 最后修改时间最后改变状态时间
  • I/O操作最佳块大小
  • 分配给该文件的块数

|M4fY#F8O!L;vm3D0 51Testing软件测试网-@8l j l ]S3y1g

函数名lstat
调用语法lstat (file);
解说与stat类似,区别是将file看作是符号链接。

f?0|(ZGxQ Fx0 

6TH0D DD;k%z;Z0
函数名time
调用语法currtime = time();
解说返回从1970年1月1日起累计秒数。

}3o4tm)]SL {0 51Testing软件测试网,Ev x!P0L,k)x5r`

函数名gmtime
调用语法timelist = gmtime (timeval);
解说将由time, stat 或 -A 和 -M 文件测试操作符返回的时间转换成格林威治时间。返回列表元素依次为:
p`0U ck\ILC]0
  • 分钟
  • 小时,0~23
  • 日期
  • 月份,0~11(一月~十二月)
  • 年份
  • 星期,0~6(周日~周六)
  • 一年中的日期,0~364
  • 是否夏令时的标志51Testing软件测试网v Y:A n b_ure:v
    详见UNIX的gmtime帮助。

i1]7y,Z v8J0 51Testing软件测试网t}-x)S/H

函数名localtime
调用语法timelist = localtime (timeval);
解说与gmtime类似,区别为将时间值转换为本地时间。

g9E,n |l0q&G0 51Testing软件测试网JqL^ER8ck2g4L

函数名utime
调用语法utime (acctime, modtime, filelist);
解说改变文件的最后访问时间和最后更改时间。例如:
7I T&uyl$l YaW0$acctime = -A "file1";
VTqv1V|_0$modtime = -M "file1";
5O2t|q!jW0@filelist = ("file2", "file3");
5EcZ*~2c#V0utime ($acctime, $modtime, @filelist);

I#b)S1a#j5e;h0 

5WQ^ gn'~6u^$l7I0
函数名fileno
调用语法filedesc = fileno (filevar);
解说返回文件的内部UNIX文件描述。参数filevar为文件变量。
51Testing软件测试网N[ ~ Wy;t-O?/Gb#Z o

 

Z7x&j(H~0
函数名fcntl
(}BA)l].yT0flock
调用语法fcntl (filevar, fcntlrtn, value);
"F.t6U dXQ:]j#y0flock (filevar, flockop);
解说详见同名UNIX函数帮助。

8ui*zk;H]:U,C0四、使用DBM文件51Testing软件测试网+Q2Zr7L%])OP j d
   Perl中可用关联数组来访问DBM文件,所用函数为dbmopen和dbmclose,在Perl5中,已用tie和untie代替。51Testing软件测试网/nJ5q*F/Oh;J T

函数名dbmopen
调用语法dbmopen (array, dbmfilename, permissions);
解说将关联数组与DBM文件相关联。参数为:
VVBc ia01、array:所用关联数组
'm!E(V@"Gu}*O}02、dbmfilename:将打开的DBM文件名51Testing软件测试网 f0n&~&l*pxUn
3、访问权限,详见mkdir

{J hG%_3e'kgb0 

.y$}.A S&NI;Yi0

TAG: Perl perl

 

评分:0

我来说两句

Open Toolbar