perl读文件

来源:互联网 发布:图片压缩大小软件 编辑:程序博客网 时间:2024/06/05 02:32

文件描述符,文件句柄
文件变量
访问模式
文件名
出错函数与变量$!
文件缓冲
其它文件打开函数
读文件
命令行参数
写文件
文件权限
随机访问
文件测试
文件状态
文件操作
文件链接
目录访问
小结

一、文件描述符
在原来linux系统中访问文件时用来代表文件的数字,它是系统资源,系统会限制打开的文件
描述符的数量.
Perl中只在某些系统调用时才使用它.

文件句柄:
功能同文件描述符一样,但是与文件描述符不是同一个东西,perl使用文件句柄来代表文件.
文件描述符与文件句柄互相转化:
文件句柄=>文件描述符:fileno(F):返回文件描述符.
文件描述符=>文件句柄:open(F,”>&n”).

二、文件变量
文件:存放在磁盘上,永久存储数据,用于读写访问。访问前要先打开文件,
结束后关闭文件.
open(HANDLE,”>filename”)||die $!; 成功返回非零,失败返回零.

HANDLE:文件句柄,文件变量.用来代表操作的文件,以字母开头,字母,数字,下划线组成.
不以$,@,%类的符号开头,可能与关键字if等重名,故一般用大写字母.

缺省打开的句柄STDIN,STDOUT,STDERR,文件描述符为0,1,2。不用调用open就可以直接访问.
STDIN:键盘输入,控制台.
STDOUT:屏幕,显示屏.
STDERR:错误输出,显示屏.

三、访问模式
文件用于读还是写,在第二个参数前的>位置。
(1) 只读:<或省略,若文件不存在则打开失败,如open(F,”file”),open(F,”<file”)
(2) 只写:>,为写打开文件,若文件不存在则创建,文件存在则清除内容再写.
(3) 追加:>>,为写打开文件,若文件不存在则创建,文件存在则不清除内容,在原内容后追加。
(4) 读写:+<,可读可写,若文件不存在则打开失败,不清除内容,不追加,直接复盖原文件.
(5) 读写+>,可读可写,若文件不存在则创建,文件存在则清除内容再写.
(6) 读写+>》,可读可写,若文件不存在则创建,文件存在则追加.
(7) 管道: |
    open(F,”| cat >hello”),把文件F的输出(print F $a)作为|后的输入.
    open(F,”comm|”),把comm的输出作为F的输入。

四、文件名

Filename:open的最后一个参数,可以是相对路径或绝对路径的文件名.
说明:
1.不含路径的文件名前的空格可以忽略,但有路径的文件名不能。
2.可以用变量来代表文件名.
3.特殊的文件名如”>file”,可能使读变成写,使用变量代表文件名时注意过滤文件名.
4.复制文件句柄:open(F,”>&STDOUT”),写入F文件的内容都变成写入屏幕STDOUT
5.使用文件描述符:open(F,”>&3″),把文件描述符复制成句柄,或者”>&=3″
6.open() 打开成功返回非零,失败返回零.
open()||die “error $!”  成功时不执行die,失败时执行.

五、错误输出函数与错误变量.

1.die($errstr):向STDERR输出指示错误信息的串,然后退出程序。
2.warn($errstr):向STDERR输出警告信息,不退出程序。
3.$!最后一次错误的信息,一般与die,warn结合使用。
说明:
die($str)中$str最后不是/n时,输出自动添加at程序名line行号,如die(“can’t open”),
输出can’t open at myprog line 13,加上/n如”can’t open”时没有添加信息.

六、文件缓冲
close(F):最后要关闭文件,隐含关闭文件,重打开已经打开的,先关闭再打开,程序退出
自动关闭,这时才真正写文件。

1.文件缓冲:通常为带缓冲的文件写,写文件时,系统先写到称为文件缓冲区的内存中,缓冲
满再真正写入磁盘.一般在关闭时缓冲内容才开始写入磁盘,称为刷新,结果是用tail -f
是看不到不断地输出内容的。
2.无文件缓冲:每次写都真正写入磁盘中,不经过内存,频繁写入可能影响性能.
3.设置$|变量决定是否有文件缓冲,$|=1无缓冲,但只对当前输出文件有效,如STDOUT,设置另外
的文件要先用select(F).
4.select(F)设置当前文件,返回原文件句柄,设置完再select(OLD)返回原文件.
         缓冲          无缓冲
打开:   open,sysopen   sysopen
关闭:   close
读:     <>,readline    sysread
写:     print          syswrite
定位:   tell,seek      sysseek

其它文件打开函数
间接文件变量:用简单变量来表示文件变量,代表文件变量名
$a=”F”;open($a,”mode”,”path”);

七、读文件
1.常见方式:$line=<file> 读一行到line,指针后移一行,缺省读到$_中
  $/=’/n’ 为行分隔符,遇到它则为一行结束,行包含$/
2.用chomp($s)去除此标志,行尾不含$/则不去除字符.
3.可设置$/为其它字符串,遇到$/为行结束,chomp去除此字符串.

@array=<file> 文件内容全部读出,每行为一个元素,含回车,当从STDIN中读时,可省略为<>.
read(F,$in,len[,$offset] 读入$in
sysread(F,$in,len[,$offset])
getc(F)读一个字符

 

八、命令行参数

@ARGV:全局,$ARGV[0] 是第一个参数,不是程序名,<>是对$ARGV的引用.@ARGV一旦赋值,原值丢失.
1.第一次看到<>时,打开以$ARGV[0]中的文件,无参数则打开STDIN读,所以可以省略.
2.shift(@ARGV)元素数量减少一个.
3.<>读打开的文件中的所有行
4.再读第二个参数表示的文件
5.文件尾检测:eof和eof(),文件结束返回真.
@ARGV=(“file1″,”file2″)
while($line=<>){if(eof){print ‘eof’;}}
读取file到末尾时,下一循环打开下一文件,每次读完一个文件输入出eof
if(eof()){print ‘eof’;}所有文件都读完才输出eof

九、写文件
print F (“str”)

F文件句柄,后面为空格,省略F为STDOUT
str输出内容,可用单引号’,不进行变量替换,不加引号,计算出变量的值再输出。
()可省略,这是函数的特点.

printf(“format str”,$a,$b….),格化化串包含%m.nf的格式指示,后面依次是相应的值列表。
write 用于格式化输出,不是read的相应操作.
syswrite(F,$data,length,$offset) 同sysread

十、文件权限和随机访问

chmod(mode,filelist)
mode=4位8进制数,unix中的文件owner,组,其它的设置。
chown(userid,groupid,filelist)改变文件的用户与组。
umask(maskval):返回原mask,unix中的umask值设置。

文件指针:
tell(F):当前位置.
seek(F,distance,pos):定位到指定位置.
F文件句柄,pos=0相对文件头,1相对当前位置,2相对文件尾.
distance相对pos表示的位置多少字节.

十一、文件测试

-op expr if(-e “filea”){print STDERR(“file1/n”):} 文件是否存在.

-b是否为块设备  -c是否为字符设备
-d是否为目录    -e文件是否存在
-f是否为普通文件 -g是否设置了setgid位
-k是否设置了sticky位 -l是否为符号连接
-o是否拥有该文件  -p是否为管道
-r是否可读     -s是否非空
-t是否表示终端  -u是否设置setuid位
-w是否可写  -x是否可执行  -z是否为空文件
-A距上次访问多长时间
-B是否为二进制文件
-C距上次访问文件的inode多长时间
-M距上次修改多长的时间
-O是否只为”真正的用户”所拥有
-R是否只有”真正的用户”可读
-S是否为socket  -T是否为文本文件
-W是否只有”真正的用户”可写
-X是否只有”真正的用户”可执行
-s返回文件长度,-A-C-M返回的天数.

十二、文件状态

stat(file):参数可为文件名,也可为文件句柄,返回文件状态的列表。

编号  名字    unix                     windows
0     dev     设备号                   c:=2,d:=3
1     ino     索引节点                 总是0
2     mode    模式                     无
3     nlink   链接号                   0
4     uid     文件所有者               0
5     gid     文件组                   0
6     rdev    特殊文件信息,设备类型    驱动器号
7     size    文件大小                 文件大小
8     atime   上次访问时间             上次访问时间
9     mtime   上次修改时间             上次修改时间
10    ctime   inode修改时间            文件创建时间
11    blksz   磁盘块大小               0
12    Blocks  文件的块数               0

utime(acctime,modtime,filelist):修改时间戳,修改访问时间,返回成功修改的文件数.

十三、文件操作

Glob:
@a=glob(“*.txt”)返回与模式匹配的所有文件目录,如果赋值给简单变量则一次返回一个文件。
参数可以是文件名或目录.
只能接受有限的文件数,报文件太多错误,用shell来执行。
因为用shell来解释执行,故运行速度慢。
另一种形式是@a=<*.txt>是古老的用法,推荐用glob.

truncate(file,lenght):将文件的长度减少到length字节,如果文件长度已经小于length,
则不做任何事.其中filename可以为文件名,也可以为文件变量.

rename(old,new)成功=1 可以从一个目录移动到另一个目录,不检查new是否存在,可能破坏文件.
-e “file2″||rename(file1,file2)  先检查再移动

十四、文件链接

link(文件名,链接名)
创建现有文件的链接-硬链接,file是被链接的文件,newlink是被创建的链接。
成功返回真,失败返回假.
当删除这两个链接中的一个时,还可以用另一个来访问该文件。

synlink符号链接(文件名,链接名)创建现有文件的符号链接,即指向文件名,而不是指向
文件本身,当原文件被删除(如:被unlinke函数删除),则被创建链接不可用,除非再创建
一个与原被链接的文件同名的文件.
Readlink(linkname)跟踪符号链接,如果linkname为符号链接文件,返回其实际指向的文件。
否则返回空串。

unlink(filelist)=成功删除的文件数,删除文件或$_中的文件,参数为文件名列表,返回值为
实际删除的文件数目.
此函数之所以叫unlink而不叫delete是因为它实际所做的是删除文件的链接。

十五、目录操作

opendir(dirvar,dirname) 打开目录,查看某目录中文件列表时也要先打开,再操作,再关闭,
参数为:
dirvar:目录变量,dirname:目录名,成功返回真值,失败返回假。
closedir(dir):关闭目录
readdir(dir):对数组返回所有文件和目录,对简单变量每次返回一个文件或目录,不含当前路径。
chdir(dir):改变目录,运行完返回原目录,成功为真,失败为假.
telldir(dir):当前目录位置
seekdir(dir,loc):到指定位置
rewinddir(dir):目录位置指向目录第一项.
mkdir(dirname,permission):创建目录(当前目录,访问权限)
rmdir(dirname):只能删除空目录,成功则返回真,失败返回假.

十六、小结

1.概念:描述符,句柄,缓冲,访问模式,权限,文件状态.
2.文件访问:打开,关闭,读,写,随机访问
3.文件操作:测试,改名,截取,链接.
4.目录操作:同文件.
5.相关技术:错误函数及变量,文件打开函数,命令行参数,glob的扩展.

原创粉丝点击