ITPub博客

首页 > 数据库 > 数据库开发技术 > perl文件操作

perl文件操作

原创 数据库开发技术 作者:liiinuuux 时间:2016-09-26 15:30:02 0 删除 编辑

从绝对路径里得到目录名和文件名
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 (<PASS>)
{
     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(<FILE>)
{
     chomp; 如果不加这个,每一行后面会多一个回车
     say;
}
行分隔符由变量$/定义,默认是回车。这个变量可以自己修改
open(FILE, "a.pl");
$/ = undef; 修改成undef,就可以起到chomp的作用
while(<FILE>)
{
     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 = <LS>)
{
        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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 调用mysql
请登录后发表评论 登录
全部评论

注册时间:2012-11-12

  • 博文量
    94
  • 访问量
    309725