0
点赞
收藏
分享

微信扫一扫

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

在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。


举报

相关推荐

0 条评论