📄 perl 语言-perl 中文教程(第五章).htm
字号:
src="Perl 语言-Perl 中文教程(第五章).files/top.gif" width=180><BR><SPAN
class=myFont><SPAN class=myFont><FONT face=宋体>翻译:</FONT></SPAN></SPAN>
<SPAN class=myFont><SPAN class=myFont>flamephoenix</SPAN></SPAN> <BR>
<HR width="100%" SIZE=1>
<DIV align=left></DIV></DIV>
<P align=center><B>第五章 文件读写 </B><BR></P>
<P><A
href="http://www.sun126.com/perl5/perl5-5.htm#一、打开、关闭文件">一、打开、关闭文件</A><BR><A
href="http://www.sun126.com/perl5/perl5-5.htm#二、读文件">二、读文件</A><BR><A
href="http://www.sun126.com/perl5/perl5-5.htm#三、写文件">三、写文件</A><BR><A
href="http://www.sun126.com/perl5/perl5-5.htm#四、判断文件状态">四、判断文件状态</A><BR><A
href="http://www.sun126.com/perl5/perl5-5.htm#五、命令行参数">五、命令行参数</A><BR><A
href="http://www.sun126.com/perl5/perl5-5.htm#六、打开管道">六、打开管道</A>
<BR><BR><A name=一、打开、关闭文件>一、打开、关闭文件</A> <BR> 语法为open (filevar,
filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号,filename为文件名,其路径可为相对路径,亦可为绝对路径。<BR> open(FILE1,"file1");<BR> open(FILE1,
"/u/jqpublic/file1");<BR> 打开文件时必须决定访问模式,在PERL中有三种访问模式:读、写和添加。后两种模式的区别在于写模式将原文件覆盖,原有内容丢失,形式为:open(outfile,">outfile");而添加模式则在原文件的末尾处继续添加内容,形式为:open(appendfile,
">>appendfile")。要注意的是,不能对文件同时进行读和写/添加操作。<BR> open的返回值用来确定打开文件的操作是否成功,当其成功时返回非零值,失败时返回零,因此可以如下判断:<BR> if
(open(MYFILE, "myfile")) {<BR> # here's what to do
if the file opened
successfully<BR> }<BR> 当文件打开失败时结束程序:<BR> unless
(open (MYFILE, "file1")) {<BR> die ("cannot open
input file
file1\n");<BR> }<BR> 亦可用逻辑或操作符表示如下:<BR> open
(MYFILE, "file1") || die ("Could not open file");
<BR> 当文件操作完毕后,用close(MYFILE); 关闭文件。<BR><BR><A name=二、读文件>二、读文件
</A><BR> 语句$line =
<MYFILE>;从文件中读取一行数据存储到简单变量$line中并把文件指针向后移动一行。<STDIN>为标准输入文件,通常为键盘输入,不需要打开。<BR><BR> 语句@array
= <MYFILE>;把文件的全部内容读入数组@array,文件的每一行(含回车符)为@array的一个元素。<BR><BR><A
name=三、写文件>三、写文件</A>
<BR> 形式为:<BR> open(OUTFILE,
">outfile");<BR> print OUTFILE ("Here is an
output
line.\n");<BR> 注:STDOUT、STDERR为标准输出和标准错误文件,通常为屏幕,且不需要打开。<BR><BR><A
name=四、判断文件状态>四、判断文件状态</A> <BR>1、文件测试操作符<BR> 语法为:-op
expr,如:<BR> if (-e "/path/file1")
{<BR> print STDERR ("File file1
exists.\n");<BR> }<BR> </P>
<P align=center>文件测试操作符 </P>
<DIV align=center>
<CENTER>
<TABLE borderColor=forestgreen cellSpacing=0 cellPadding=2 width="70%"
border=1>
<TBODY>
<TR>
<TD class=myFont vAlign=top width=192><B>操作符</B></TD>
<TD class=myFont vAlign=top width=384><B>描述</B></TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-b</TD>
<TD class=myFont vAlign=top width=384>是否为块设备</TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-c </TD>
<TD class=myFont vAlign=top width=384>是否为字符设备 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-d </TD>
<TD class=myFont vAlign=top width=384>是否为目录 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-e </TD>
<TD class=myFont vAlign=top width=384>是否存在 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-f </TD>
<TD class=myFont vAlign=top width=384>是否为普通文件 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-g </TD>
<TD class=myFont vAlign=top width=384>是否设置了setgid位 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-k </TD>
<TD class=myFont vAlign=top width=384>是否设置了sticky位 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-l </TD>
<TD class=myFont vAlign=top width=384>是否为符号链接 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-o </TD>
<TD class=myFont vAlign=top width=384>是否拥有该文件 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-p </TD>
<TD class=myFont vAlign=top width=384>是否为管道 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-r </TD>
<TD class=myFont vAlign=top width=384>是否可读 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-s </TD>
<TD class=myFont vAlign=top width=384>是否非空 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-t </TD>
<TD class=myFont vAlign=top width=384>是否表示终端 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-u </TD>
<TD class=myFont vAlign=top width=384>是否设置了setuid位 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-w </TD>
<TD class=myFont vAlign=top width=384>是否可写 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-x </TD>
<TD class=myFont vAlign=top width=384>是否可执行 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-z </TD>
<TD class=myFont vAlign=top width=384>是否为空文件 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-A </TD>
<TD class=myFont vAlign=top width=384>距上次访问多长时间 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-B </TD>
<TD class=myFont vAlign=top width=384>是否为二进制文件 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-C </TD>
<TD class=myFont vAlign=top width=384>距上次访问文件的inode多长时间 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-M </TD>
<TD class=myFont vAlign=top width=384>距上次修改多长时间 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-O </TD>
<TD class=myFont vAlign=top width=384>是否只为“真正的用户”所拥有 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-R </TD>
<TD class=myFont vAlign=top width=384>是否只有“真正的用户”可读 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-S </TD>
<TD class=myFont vAlign=top width=384>是否为socket </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-T </TD>
<TD class=myFont vAlign=top width=384>是否为文本文件 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-W </TD>
<TD class=myFont vAlign=top width=384>是否只有"真正的用户"可写 </TD></TR>
<TR>
<TD class=myFont vAlign=top width=192>-X </TD>
<TD class=myFont vAlign=top width=384>是否只有"真正的用户"可执行 </TD></TR>
<TR>
<TD class=myFont
colSpan=2>注:“真正的用户”指登录时指定的userid,与当前进程用户ID相对,命令suid可以改变有效用户ID。</TD></TR></TBODY></TABLE><BR></CENTER></DIV>
<P> 例:<BR> unless (open(INFILE,
"infile")) {<BR> die ("Input file infile cannot be
opened.\n");<BR> }<BR> if
(-e "outfile") {<BR> die ("Output file outfile
already
exists.\n");<BR> }<BR> unless
(open(OUTFILE, ">outfile")) {<BR> die ("Output
file outfile cannot be
opened.\n");<BR> }<BR> 等价于<BR> open(INFILE,
"infile") && !(-e "outfile")
&&<BR> open(OUTFILE, ">outfile") ||
die("Cannot open files\n");<BR><BR><A name=五、命令行参数>五、命令行参数</A>
<BR> 象C一样,PERL也有存储命令行参数的数组@ARGV,可以用来分别处理各个命令行参数;与C不同的是,$ARGV[0]是第一个参数,而不是程序名本身。<BR> $var
= $ARGV[0]; # 第一个参数<BR> $numargs = @ARGV; #
参数的个数<BR> PERL中,<>操作符实际上是对数组@ARGV的隐含的引用,其工作原理为:<BR>1、当PERL解释器第一次看到<>时,打开以$ARGV[0]为文件名的文件;<BR>2、执行动作shift(@ARGV);
即把数组@ARGV的元素向前移动一个,其元素数量即减少了一个。<BR>3、<>操作符读取在第一步打开的文件中的所有行。<BR>4、读完后,解释器回到第一步重复。<BR> 例:<BR> @ARGV
= ("myfile1", "myfile2"); #实际上由命令行参数赋值<BR> while
($line = <>) {<BR> print
($line);<BR> }
<BR> 将把文件myfile1和myfile2的内容打印出来。<BR><BR><A
name=六、打开管道>六、打开管道</A> <BR> 用程序的形式也可以象命令行一样打开和使用管道(ex:ls >
tempfile)。如语句open (MYPIPE, "| cat >hello"); 打开一个管道,发送到MYPIPE的输出成为命令"cat
>hello"的输入。由于cat命令将显示输入文件的内容,故该语句等价于open(MYPIPE, ">hello");
用管道发送邮件如下:<BR> open (MESSAGE, "| mail
dave");<BR> print MESSAGE ("Hi, Dave! Your Perl
program sent this!\n");<BR> close (MESSAGE);
</P></TD></TR></TBODY></TABLE>
<DIV align=center></DIV>
<DIV align=center><BR></DIV>
<DIV align=center><SPAN class=myFont><A
href="http://www.sun126.com/perl5/perl5-4.htm">上页</A> <A
href="http://www.sun126.com/perl5/perl5-6.htm">下页</A> <A
href="http://www.sun126.com/perl5/perl5index.htm">回目录</A> <A
href="http://www.sun126.com/perl5/perl5-5.htm#a"><FONT face="Arial, 宋体">Go
Top</FONT></A></SPAN><BR><BR></DIV>
<TABLE height=50 cellSpacing=0 cellPadding=0 width="100%" bgColor=#000000
border=0>
<TBODY>
<TR>
<TD bgColor=#cccc99 height=4>
<DIV align=center><IMG height=4 src="" width=4></DIV></TD></TR>
<TR>
<TD height=50>
<DIV align=center><FONT class=myfont size=2><SPAN class=myfont><FONT
color=#99cc99><A href="http://www.sun126.com/bbs/ccb/index.cgi"><FONT
color=#99cc99>中国CCB论坛</FONT></A> 整理 麻辣
2003.7.10</FONT></SPAN></FONT><FONT class=myfont color=#99cc99
size=2><SPAN class=myfont><FONT
color=#99cc66><BR></FONT></SPAN></FONT><SPAN class=myfont><FONT
class=myfont><SPAN class=myfont><FONT face="Arial, Helvetica, sans-serif"
color=#99cc99>© 2000
http://www.sun126.com</FONT></SPAN></FONT></SPAN></DIV></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -