从绝对路径里得到目录名和文件名
use File::Basename;
use 5.010; 加载了5.010新特性后,就可以用say函数输出,相当于println
$fname = "/usr/bin/perl";
$bname =
basename $fname;
$dname =
dirname $fname;
say $dname;
say $bname;
也可以一次获取文件名、目录、后缀
qr括起来的表示是正则表达式
my($fileName, $dir, $suffix) = fileparse("/root/pl/test.tar.gz",
qr(\..+$));
得到
test
/root/pl/
.tar.gz
my($fileName, $dir, $suffix) = fileparse("/root/pl/test.tar.gz",
qr(\.[^.]+$));
得到
test.tar
/root/pl/
.gz
打开文件,逐行打印
if (! open PASS, "/etc/passwd")
{
die "open file error. ($!)" ;
}
while (
)
{
chomp;
say;
}
输出到执行的文件
if (! open LOG, ">>/tmp/tmplog")
{
die "open file error. ($!)" ;
}
print LOG "test log....\n";
或者用select函数设置默认的输出句柄
select LOG;
print "test log....\n";
判断文件存在
$filename = "asasdasd";
die "file not extsts." if !
-e $filename;
文件测试
最后一次改动发生在10天以前
open(FILE, "/etc/hosts");
die "file too old." if -M FILE > 10;
可读并且可写
if ( -r "/root/.bash_profile" and -w "/root/.bash_profile")
{
say "ok";
}
第二个文件名是重复劳动,可以用下划线代替上一个测试过的文件名
if ( -r "/root/.bash_profile" and -w _ )
{
say "ok";
}
也可以分开写
if ( -r "/root/.bash_profile")
{
say "read";
}
if ( -w _ )
{
say "write";
}
if ( -o _ )
{
say "owner";
}
或者将要测试的选项放到一起
if ( -r -w -o "/root/.bash_profile")
{
say "OK";
}
判断自己是文件的拥有者,并且文件小于128字节
if ( -o "/root/pl/a.pl" and -s _ < 128 )
{
say "own and less than 128.";
}
其它判断条件
-r 可读
-w 可写
-x 可执行
-o 拥有
-R 对实际用户可读
-W 对实际用户可写
-X 对实际用户可执行
-O 由实际用户拥有
-e 存在
-z 存在且为空文件(对目录来说永远为假)
-s 存在且有内容(返回文件大小)
-f 是普通文件
-d 是目录
-l 是符号链接
-S 是socket
-p 是明明管道
-b 是块设备
-c 是字符设备
-u 文件或目录设置了setuid
-g 文件或目录设置了setgid
-k 文件或目录设置了sticky
-t 文件句柄是TTY设备(必须是句柄)
-T 看起来是文本文件
-B 看起来是二进制文件
-M 最后一次修改至今的天数
-A 最后一次访问至今的天数
-C 最后一次inode变更至今的天数
其中:
-w对CD-ROM中的文件有可能返回真
-x对空文件有可能返回真
获取文件详细信息
my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat("/root/pl/a.pl");
返回的日期是总1900年到今天的秒数,可以通过下面代码转成可读的时间
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($atime);
$year += 1900;
$mon += 1;
print $year."\n";
print $mon."\n";
print $mday."\n";
返回的权限为$mode可读性差,可以这样处理
$mode2 = $mode & 0777 ;
printf("%b, %o\n", $mode2, $mode2);
得到类似111100100和744
读取文件夹
$dir = "/var";
opendir(DIR, $dir) or die "open dir $dir err . ($!)";
while ($fname = readdir(DIR))
{
say $dir."/".$fname;
}
closedir(DIR);
删除文件
unlink("x.txt");
逐行读取文件
open(FILE, "a.pl");
while()
{
chomp; 如果不加这个,每一行后面会多一个回车
say;
}
行分隔符由变量$/定义,默认是回车。这个变量可以自己修改
open(FILE, "a.pl");
$/ = undef; 修改成undef,就可以起到chomp的作用
while()
{
say;
}
拷贝、移动文件
use File::Copy;
copy("a.pl", "aa.pl"); 拷贝文件
copy("a.pl", \*STDOUT); 将文件拷贝至标准输出
move("a.pl", "aa.pl"); 移动文件
查找文件
找出root下,以.pl结尾的文件
利用File::Find,可以将目录下的所有子目录和所有文件的文件名放到$File::Find::name里,以用户定义的回调函数进行处理(当然也可以对文件座操作)。
use File::Find;
my $dir = "/root";
sub wanted
{
if(-f $File::Find::name && $File::Find::name =~
/\.pl$/)
{
print $File::Find::name."\n";
}
}
find(\&wanted, $dir);
或者将匹配用的正则表达式放到变量里
use File::Find;
my $dir = "/root";
my $part = qr(\.pl$);
sub wanted
{
if(-f $File::Find::name && $File::Find::name =~
$part)
{
print $File::Find::name."\n";
}
}
find(\&wanted, $dir);
原地修改文件内容
test.txt的内容
#user = AA
user = r oo t # mysql root
# port = 2000
port =
use Tie::File; 引入tie模块
my $file = "test.txt";
$u = "mysql";
$p = 8000;
tie (my @array, Tie::File, $file) or die "ftie error: $!"; 将文件内容映射到一个数组上,对数组的任何修改都会反映到文件本身
foreach (@array)
{
s/(^\s*user\s*=\s*)[^#]*(#*.*)$/$1$u $2/;
s/(^\s*port\s*=\s*)[^#]*(#*.*)$/$1$p $2/;
}
untie @array; 解除映射
修改后
1 备注是掉的保持不变
2 没有注释的参数,修改了参数值,但是行尾的注释被保留了
3 参数前面如果有空格也保留
4 保持原来的“=”前后留空格的风格
#user = AA
user = mysql # mysql root
# port = 2000
port =8000
输入管道
将操作系统命令的输出管道至文件句柄
open LS, "ls -l | grep a |";
while($line = )
{
print $line;
}
close LS;
输出管道
利用print将数据通过管道传递给其它程序
open WC, " | wc -l";
print WC "line1\n";
print WC "line2\n";
print WC "line3\n";
close WC;
将输出3
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26239116/viewspace-2125605/,如需转载,请注明出处,否则将追究法律责任。