http://blog.csdn.net/xrt95050/archive/2011/05/03/6386662.aspx
? perl 文件操作 收藏
打开、关闭文件
?? open (filevar,filename)
??? filevar为文件句柄,或者说是程序中用来代表某文件的代号
??? filename为文件名,其路径可为相对路径,亦可为绝对路径
open(FILE1,"file1");
open(FILE1,"/u/jqpublic/file1");
?
?? 打开文件时必须决定访问模式
open(FILE1,"file1");
?read
?
open(outfile,">outfile");
?write写模式将原文件覆盖,原有内容丢失
open(appendfile,">>appendfile");
?append
?
??
??? open的返回值用来确定打开文件的操作是否成功,成功时返回非零值,失败时返回零:
if (! open(MYFILE,"myfile")) {
??? die ("cannot open input file file1n");
??? }
?
?open (MYFILE,"file1") || die ("Could not open file");
?
??? close (MYFILE);
??? 例子.读文件并显示
#!/usr/bin/perl
&gotest("/home/macg/perltest/gogo");
&gotest("/home/macg/www/index.html");
&gotest("jk");
sub gotest{
my(@tmp)=@_;
open (MYFILE,$tmp[0]) || die ("Could not open file");
@array = <MYFILE>;????? 此句不是读一行,而是读整个文件
foreach (@array) {
?print $_;
?? }
close(MYFILE);
}
?
[macg@localhost perltest]$ ./tip.pl
kkkkk?????????????? 第一个文件gogo读出
第二个文件index.html读出
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<frameset rows=20%,*>
<frame src='#'" frameborder="no" scrolling="no">
<frameset cols=30%,*>
<frame src='#'" frameborder="no" name="left">
<frame src='#'" frameborder="no" name="right">
</frameset>
</frameset>
第三个文件jk不存在,程序走die语句
Could not open file at ./tip.pl line 9
?
?
??? 打开管道文件--------操作非常简单,就是以带管道符号的命令作为文件名字符串
??? 执行一个管道命令
??? 假设管道命令创建一个临时文件
??? 再OPEN这个临时文件到句柄
[macg@localhost perltest]$ vi tip.pl
#!/usr/bin/perl
&gotest("ls -l |");
sub gotest{
my(@tmp)=@_;
open (MYFILE,$tmp[0]) || die ("Could not open file");
@array = <MYFILE>;
foreach (@array) {
?print $_;
????? }
close(MYFILE);
}
?
[macg@localhost perltest]$ ./tip.pl
total 16
-rw-rw-r--? 1 macg macg?? 6 Mar 16 13:06 gogo
-rwxrwxr-x? 1 macg macg 192 Mar 17 16:53 tip.pl
?
?
??? 读文件
$line = <MYFILE>;
?读一行
并把文件指针向后移动一行
?
@array = <MYFILE>;
?读全部
文件的每一行(含回车符)为@array的一个字符串元素
?
最简单的显示文件
@array = <MYFILE>;????? 一次读整个文件,读入一个字符串数组
foreach (@array) {??????????? 再打印字符串数组的每一个元素(每一行)
?print $_;
????? }
?
[macg@localhost perltest]$ ./tip.pl
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<frameset rows=20%,*>
</frameset>
</frameset>
?
my($line);
while ($line=<MYFILE>) {循环读一行,读不出就为NULL(0)
?print $line;?
?}
?
?
??? $line =<STDIN> ;????? 从键盘读一行
,类似C的gets();
?
??? chomp 函数,截去变量尾端的n换行,常与键盘输入合用,方法有二?:
1??? $yourans=<STDIN>;
????? chomp $yourans;
?
2??? chomp ($yourans=<STDIN>);
?
?
?? 注意:一定不要用while (chomp($line=<MYFILE>)),因为chomp总是返回0值,和while($line=<MYFILE>)是不同的
while($line=<MYFILE>){
chomp($line);? 把 chomp放在循环里边
…
}?
?
?
?? <> 和 <STDIN> 的区别
先说相同点:都支持标准输入读取
不同点:<> 可以将输入定向到命令行参数
vi? readfile.pl
#! /usr/bin/perl
while (<>) {
??? print;
}
?
./readfile.pl index.html??? 就是读取第一个命令行参数所指的文件
./readfile.pl?????????????? 如果不带任何参数执行,就是由标准输入STDIN读取
?
?
?? 写文件???? print/printf? 句柄 (字串);
open(OUTFILE,">outfile");
print OUTFILE ("Here is an output line.n");
?
print STDERR ("File file1 exists.n");
print STDOUT ("File file1 exists.n");
?
?
??? 最简单的文件COPY
#!/usr/bin/perl
&gotest("ls -l |","test");
sub gotest{
my(@tmp)=@_;
open (READFILE,$tmp[0]) || die ("Could not open file");
open (WRITEFILE,">".$tmp[1]) || die ("Could not open file");
my($line);
while ($line=<READFILE>) {
?print WRITEFILE $line;
? }
close(READFILE);
close(WRITEFILE);
?}
?
[macg@localhost perltest]$ ./tip.pl
[macg@localhost perltest]$ ls
gogo? test? tip.pl
[macg@localhost perltest]$ cat test
-rw-rw-r--? 1 macg macg?? 6 Mar 16 13:06 gogo
-rwxrwxr-x? 1 macg macg 297 Mar 17 17:43 tip.pl
?
??? 上例同时也是一次管道文件的建立,相当于ls –l >test
??? -e? 文件是否存在??????? -d 目录是否存在
#!/usr/bin/perl
chomp($file=<>);
&gotest($file);
sub gotest{
my(@tmp)=@_;
if (-e $tmp[0]) {
? print "file is existn";
?} else { print "file not foundn"; }
}
?
[macg@localhost perltest]$ ./tip.pl
gogo
file is exist
[macg@localhost perltest]$ ./tip.pl
kd
file not found
?
#!/usr/bin/perl
chomp($file=<>);
&gotest($file);
sub gotest{
my(@tmp)=@_;
if (-d $tmp[0]) {
? print "directory is existn";
?} else { print "directory not foundn"; }
}
?
[macg@localhost perltest]$ ls -F
gogo? test? testdir/? tip.pl*
[macg@localhost perltest]$ ./tip.pl
kj
directory not found
[macg@localhost perltest]$ ./tip.pl
testdir
directory is exist
?
?
if (!-e $file)????? 如果文件不存在
?
??? -r,-w,-x 权限
if (-w $file) {
??? print "$file 写权限!n";
}
??
if (-x $file) {
??? print "$file 读权限!n";
}??
?? -z是否为空文件,-s是否非空
if (-z $tmp[0]) {
? print "file is emptyn";
?}
?
if ($len= -s $tmp[0]) {? -s不仅能判断文件非空,还兼有计算文件大小的工作
?print "file length is $len n";
? }
?
[macg@localhost perltest]$ touch pp
[macg@localhost perltest]$ ./tip.pl
pp
file is empty
[macg@localhost perltest]$ ./tip.pl
gogo
file length is 6?
?
?
-l? 是否为符号链接
-T? 是否为文本文件
?? 基本文件操作
删文件
#!/usr/bin/perl
chomp($file=<>);
&gotest($file);
sub gotest{
my(@tmp)=@_;
my($len);
unlink $tmp[0] if -e $tmp[0];
}
?
[macg@localhost perltest]$ ls
go? test? testdir? tip.pl
[macg@localhost perltest]$ ./tip.pl
go
[macg@localhost perltest]$ ls
test? testdir? tip.pl
?
[macg@localhost perltest]$ ls
dd? test? testdir? tip.pl
[macg@localhost perltest]$ ./tip.pl
/home/macg/perltest/dd?????????? 全路径删除
[macg@localhost perltest]$ ls
test? testdir? tip.pl
?
rename("原文件名","新名");
#!/usr/bin/perl
&gotest("gogo","dd");
sub gotest{
my(@tmp)=@_;
rename($tmp[0],$tmp[1]);
}
?
[macg@localhost perltest]$ ls
gogo? pp? test? testdir? tip.pl
[macg@localhost perltest]$ ./tip.pl
[macg@localhost perltest]$ ls
dd? pp? test? testdir? tip.pl
?
??? 取文件属性,共13个属性
#!/usr/bin/perl
chomp($file=<>);
&gotest($file);
sub gotest{
my(@tmp)=@_;
my(@sta)=stat($tmp[0]);
my($j);
for($j=0;$j<13;$j++) {
?print "no.$j is $sta[$j] n";
? }
}
?
[macg@localhost perltest]$ ls
test? testdir? tip.pl
[macg@localhost perltest]$ ./tip.pl
test
no.0 is 770
no.1 is 809748
no.2 is 33204
no.3 is 1
no.4 is 500????? uid
no.5 is 500
no.6 is 0
no.7 is 103???? length文件大小
no.8 is 1174127246
no.9 is 1174124625
no.10 is 1174124625
no.11 is 4096
no.12 is 16??
?
?
?
??? 文件copy命令????????????? 必须先use模块File
#!/usr/bin/perl
chomp($file=<>);
chomp($file2=<>);
&gotest($file,$file2);
sub gotest{
my(@tmp)=@_;
use File::Copy;???? 在perl主目录下查找File/Copy.pm
copy($tmp[0],$tmp[1]);
}??
?
[macg@localhost perltest]$ ./tip.pl
test
newtest
[macg@localhost perltest]$ ls
newtest? test? testdir? tip.pl?
?
[root@localhost perltest]# ls -F /usr/lib/perl5/5.8.6/File
Basename.pm? CheckTree.pm? Compare.pm? Copy.pm? DosGlob.pm? Find.pm? Path.pm? Spec/? Spec.pm? stat.pm? Temp.pm
?
?
?? 目录操作
? chdir("testdir") || die "$!";
? mkdir($dir,0755)? || die "$!";
? rmdir("testdir") || die "$!";
#!/usr/bin/perl
chomp($directory=<>);
chomp($choice=<>);
&gotest($directory,$choice);
sub gotest{
my(@tmp)=@_;
if($tmp[1]) {
mkdir($tmp[0],0755)? || die "$!";
?? } else {
rmdir($tmp[0]) || die "$!";
???? }
}
?
[macg@localhost perltest]$ ./tip.pl
newdir
1
[macg@localhost perltest]$ ls -F
newdir/? newtest? test? testdir/? tip.pl*??
[macg@localhost perltest]$ ./tip.pl
testdir
0
Directory not empty at ./tip.pl line 13,<> line 2
rmdir的die信息
?
?? 改变文件属性和所属(需在root下才能起作用。换句话说,这是必须在ROOT下执行的PERL语句)
chmod(0755,"file1.txt","file2.txt");?
?
$uid=500;
$gid=500;
chown($uid,$gid,"file2.txt");??
?
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xrt95050/archive/2011/05/03/6386662.aspx