打开、关闭文件
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 file1/n"); } |
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="title.html" frameborder="no" scrolling="no"> <frameset cols=30%,*> <frame src="index-left.htm" frameborder="no" name="left"> <frame src="main-right.html" 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%,*> <frame src="title.html" frameborder="no" scrolling="no"> <frameset cols=30%,*> </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 exist/n"; } else { print "file not found/n"; } } |
[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 exist/n"; } else { print "directory not found/n"; } } |
[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 empty/n"; } |
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, "file1.txt", "file2.txt"); |