Chinaunix首页 | 论坛 | 博客
  • 博客访问: 449339
  • 博文数量: 141
  • 博客积分: 211
  • 博客等级: 入伍新兵
  • 技术积分: 1049
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-17 16:25
个人简介

如此经年,望尽千帆。

文章分类

全部博文(141)

文章存档

2014年(73)

2013年(65)

2012年(3)

我的朋友

分类: PERL

2013-10-23 13:50:46

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 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 = ; 此句不是读一行,而是读整个文件 foreach (@array) { print $_;
} close(MYFILE);
}
[macg@localhost perltest]$ ./tip.pl

kkkkk 第一个文件gogo读出

第二个文件index.html读出


  
  
    
    
  

第三个文件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 = ; 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 = ;
读一行
并把文件指针向后移动一行
@array = ;
读全部
文件的每一行(含回车符)为@array的一个字符串元素
最简单的显示文件
@array = ; 一次读整个文件,读入一个字符串数组

foreach (@array) { 再打印字符串数组的每一个元素(每一行)
print $_;
}

[macg@localhost perltest]$ ./tip.pl
"Content-Type" content="text/html; charset=gb2312">

20%,*>
  "title.html" frameborder="no" scrolling="no">
  30%,*>
  
 my($line); while ($line=) {循环读一行,读不出就为NULL(0print $line; 
} $line = ; 从键盘读一行,类似C的gets();

chomp 函数,截去变量尾端的\n换行,常与键盘输入合用,方法有二種:

1)$yourans=;
chomp $yourans;

2)chomp ($yourans=);

注意:一定不要用while (chomp($line=)),因为chomp总是返回0值,和while($line=)是不同的
while($line=){
chomp($line); 把 chomp放在循环里边



<> 和 的区别
先说相同点:都支持标准输入读取
不同点:<> 可以将输入定向到命令行参数
vi readfile.pl

#! /usr/bin/perl
while (<>) {
print;


./readfile.pl index.html 就是读取第一个命令行参数所指的文件
./readfile.pl 如果不带任何参数执行,就是由标准输入STDIN读取

有关的内容,读到这里,是不是有种越种越清晰的感觉了呢?!
Let's go!

写文件 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=) {
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

目录操作

[python] view plaincopy
  1. chdir("testdir") || die "$!";  
  2. mkdir($dir, 0755) || die "$!";  
  3. rmdir("testdir") || die "$!";  
  4.   
  5. #!/usr/bin/perl  
  6.   
  7. chomp($directory=<>);  
  8. chomp($choice=<>);  
  9. &gotest($directory,$choice);  
  10.   
  11. sub gotest{  
  12. my(@tmp)=@_;  
  13.   
  14. if($tmp[1]) {  
  15. mkdir($tmp[0], 0755) || die "$!";  
  16. else {  
  17. rmdir($tmp[0]) || die "$!";  
  18. }  
  19. }  
  20.   
  21. [macg@localhost perltest]$ ./tip.pl  
  22. newdir  
  23. 1  
  24. [macg@localhost perltest]$ ls -F  
  25. newdir/ newtest test testdir/ tip.pl*   
  26. [macg@localhost perltest]$ ./tip.pl  
  27. testdir  
  28. 0  
  29. 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");

本文原始链接:

阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~