Perl学习笔记-5

一. 文件测试

  1. 获得帮助
perldoc -f -e
  1. 测试应用
#-e 测试文件是否存在
die "Oops!A file called '$filename' already exists.\n" if -e $filename;

#-M 文件最后一次修改时间到当前时刻之间的天数
warn "Config file is looking pretty old~\n" if -M CONFIG > 28; 

#-s 返回文件的字节大小 -A 文件最后一次访问到当前时刻的天数
#使用and连接多项测试
foreach my $filename (@original_files){
	push @big_old_files, $filename if -s $filename > 100_000 and -A $filename >90;
}

if(-r $file and -w $file){
	...
}
  1. 常用文件测试符
文件测试符 说明
-r 文件或目录,对当前用户/组是可读的
-w 文件或目录,对当前用户/组是可写的
-x 文件或目录,对当前用户/组是可执行的
-o 文件或目录,由当前用户所拥有
-R 文件或目录,对实际的用户或组可读
-W 文件或目录,对实际的用户或组可读
-X 文件或目录,对实际的用户或组可执行
-O 文件或目录,由实际用户所拥有
-e 文件或目录是存在的
-z 文件为空
-s 返回文件的字节数
-f 是普通文件
-d 是目录
-l 是符号链接
-S 是Socket类型文件
-p 是命名管道
-b 是块设备
-c 是字符设备文件
-u 设置了SUID
-g 设置了SGID
-k 设置了Sticky-bit
-t 是TTY设备
-T 看起来像文本文件
-B 看起来像二进制文件
-M 最后一次修改到今天的天数
-A 最后一次访问到今天的天数
-C 最后一次inode被修改到今天的天数

注:当前用户/组指当前运行程序的人。

  1. 测试统一文件的多项属性

“ _ ” 虚拟文件句柄,它会告诉Perl用上次查询过的文件信息来做当前测试。这样只需要查询一次文件信息即可。

if(-r $file and -w _){
	...
}
或者
if(-r $file){
	...
}
if(-w _){
	...
}
或者采用栈式文件测试
if(-w -r -x -o -d $file){
	...
}
if((-d $file and -s _) < 512){
	...
}
或者
if(-d $file and -s _ < 512){
	...
}

二. 目录操作

  1. cd
chdir '/etc/' or die "can't cd to /etc/: $!";
  1. 文件名展开
shell中有
$ echo *.pl
test1.pl test2.pl test3.pl test4.pl

在perl中使用glob会产生相同效果。

my @pm_files=glob '*.pm';
  1. 目录句柄

目录句柄操作得到的是目录中的文件。

my $dir_to_process='/etc';
opendir my $dh, $dir_to_process or die "Can't open $dir_to_process: $!";
foreach $file (readdir $dh){
	print "one file in $dir_to_process is $file\n";
}
closedir $dh;

也可以将$dh换成裸字“ DIR ”作为目录句柄。

  1. 新建目录
mkdir 'fred', 0755 or warn "Can't create fred dir: $!\n";
mkdir $name, oct($perms);
  1. 删除目录
删除空目录
rmdir $temp_dir;

完整方案参考File::Path模块。

三. 文件操作

  1. 删除文件
unlink 'file1', 'file2', 'file3';
或者
unlink qw( file1, file2, file3 );
  1. 删除多个文件
#unlink返回成功删除的文件数
unlink glob '*.o';
或者
foreach my $file (qw(file1 file2 file3)){
	unlink $file or warn "failed on $file: $!\n";
}

注意:删除文件的权限和文件本身的权限无关,它取决于文件所在目录的权限。

  1. 重命名文件
rename 'old', 'new';  #这里的,可以替换为=>

这里rename功能和shell的mv命令功能相同。
一个例子

foreach my $file (glob "*.old"){
	my $newfile=$file;
	$newfile =~ s/\.old$/.new/;
	if(-e $newfile){
		warn "can't rename $file to $newfile: $newfile exists\n";
	}elsif(rename $file => $newfile){}
	else{
		warn "rename $file to $newfile failed: $!\n";
	}
}
  1. PID文件
    Perl会将进程的PID存入“ $$ ”默认变量中。

  2. 修改权限

chmod 0755, 'fred', 'barney';
  1. 修改隶属关系
my $user=1004;
my $group=100;
或者
defined(my $user=getpwnam 'user1') or die 'bad user';
defined(my $group=getgrnam 'group1') or die 'bad group';

chown $user, $group, glob '*.o';

defined函数用于检查返回值不是undef。

你可能感兴趣的:(perl,perl)