Perl笔记:11、目录操作
在目录树中切换 程序运行时会以自己的工作目录作为相对路径的起点。可以使用chdir操作符来改变当前的工作目录,这和shell下的cd命令差不多: 如果chdir省略参数则跳到当前的目录,这实际上是没有什么意义的。 文件名通配一般来说shell会将命令行里的文件名模式展开成所有匹配的文件名。这称之为文件名通配。如,假设将*.pm这个文件名模式交给echo命令,shell会将它展开成名成相匹配的文件列表:
$
echo
*.pm
barney.pm dino.pm fred.pm wilma.pm 这里的echo命令不必知道该如何展开*.pm,因为shell会将它展开,再交给echo处理,这也同样适合于perl程序:
#!/usr/bin/perl -w
use strict ; foreach ( @ ARGV ) { print "one arg is $_n" ; } $ perl show-args *.txt 有些时候在程序内部,也可能会想要用*.txt之类的模式。我们可以使用glob操作符将它展开成相匹配的文件名: 文件通配符的另外一种写法除了上面介绍的glob操作符之外我们可以使用一种简单的方式在perl使用文件通配符,那就是"尖括号写法"(<>):
my
@all_files
=
<*>
# 与 my @my_files = glob "*" 一样 my $dir = "/etc" ; my @dir_files = < $dir /* $dir /.*>; # $dir变量也会替换为相应的内容 注意:尖括号在perl中即代表了从文件句柄读取,又代表了文件名通配操作,那Perl是如何决定是哪一种的呢?因为合理的文件句柄必须是严格意义上的Perl标识符,所以如果尖括号满足Perl标识符条件的,就作为文件句柄来读取,否则它代表的iushi文件名通配操作。举例来说:
my
@files
=
<FRED
/*>;
## glob
my @lines = <FRED> ; ## 从文件句柄读取 my $name = "FRED" ; my @files = < $name /*>; ## glob my @lines = < $name >; ## 对句柄FRED进行间接文件句柄读取 目录句柄若要从目录中取得文件名列表,那就要用到目录句柄,它和文件句柄类似,可以使用opendir打开,readdir读取,closedir关闭,只不多读取的时候是目中的文件名而不是文件的内容,如下例子:
#!/usr/bin/perl -w
use strict ; my $dir_to_process = "/etc" ; opendir DH , $dir_to_process or die "Cannot open $dir_to_process: $!" ; foreach my $file ( readdir DH ) { print "one file in $dir_to_process is $filen" ; } closedir DH ; 运行:perl readdir.pl
#!/usr/bin/perl -w
use strict ; my @file ; my $dir_to_process = "/etc" ; opendir DH , $dir_to_process or die "Cannot open $dir_to_process: $!" ; foreach my $file ( readdir DH ) { next if $file =~ /^./ ; next unless $file =~ /.conf$/ ; push @file , "$dir_to_process/$filen" ; } print sort @file ; closedir DH ; --这样输出的文件是按照字母顺序且都是.conf的文件 删除文件使用unlink操作符删除文件:
my
$successful
=
unlink
"slate"
,
"bedrock"
,
"lava"
;
print "I deleted $successful file(s) just nown" ; 重命名文件使用rename函数来重命名文件,写法: rename "old","new";
foreach
my
$file
(
glob
"*.old"
)
{
my $newfile = $file ; $newfile =~ s/.old$/.new/ ; if ( -e $newfile ) { warn "can't rename $file to $newfile: $newfile existsn" ; } elsif ( rename $file , $newfile ) { ## 改名成功,什么都不做 } else { warn "rename $file to $newfile failed: $!n" ; --此程序会先检查$newfile是否村咋,因为只要用户有删除目标文件的权限rename就会毫不忧郁的覆盖现有的文件。加上这项敬爱奶茶可以减低损失数据的几率 建立和删除目录mkdir DIRNAME,MASK mkdir执行后成功返回true失败返回false并设置$!的内容。 [ccie lang="perl"]mkdir "fred",0755 or warn "Cannot make fred directory: $!";[/cce] 注意:MASK最好不要用变量的形式指定,否则perl会认为这个变量时十进制的数字,而非mkdir认为的八进制,因此,在指定MASK最好使用数字,或者用oct函数转换一下变量,如下:
my
$name
=
"fred"
;
my $permissions = "0755" ; mkdir $name , oct ( $permissions ) ; 修改权限chmod 0755,"fred","barney"; 更改属主
my
$user
=
1004
;
my $group = 100 ; chown $user , $group , glob "*.o" ; --如果要处理的不是数字,而是像apache这样的字符串该如何处理呢?很简单,使用getpwnam与getgrnam函数来把用户名或组名转成数字即可,如下:
defined
(
my
$user
=
getpwnam
"merlyn"
)
or
die
"bad user"
;
defined ( my $group = getgrnam "users" ) or die "bad group" ; chown $user , glob "/home/merlyn/*" ; --这里我们使用了defined函数来确认返回值不是undef,也就是说验证指定的用户或组是否真的存在。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |