zoukankan      html  css  js  c++  java
  • perl学习笔记——目录操作

    在目录书中移动

    chdir 操作副改变当前的工作目录。它和shellcd命令类似:

    chdir ‘/etc’ or die “cannot chdir to /etc:$1”;

    注意:工作目录不能更改的,也就是说Perl程序返回后一定会回到所在的工作目录。

    如果调用chdir时不加参数,Perl会猜想是想要回到用户主目录,并将工作目录设成主目录,这和shell下使用不加参数的cd命令效果相同。

    注意:可不能使用波浪符~。

    文件名通配

    形如:echo *.pm;其中通配符是*。在Perl中同样适用:

    my @all_files=glob ‘*’;

    My @pm_files=glob ‘*.pm’;

    其中,@all_files取得当前目录中的所有文件并且按照字母顺序排序,但不包括以点号开头的文件,这和shell中的做法完全相同(ls)

    如果需要一次匹配多种模式,可以在参数中用空格隔开各个模式:

    my all_files_including_dot=glob '*.gz *.pl';

    文件通配的另一种语法

    使用<>完成glob的功能,如:

    my @all_files=<*>;#效果等同于: my @all_files=glob “*”;

    Perl会把尖括号<>内出现的变量替换为他的值,类似与双引号内字符串的变量内插。

    my $dir='/etc';

    my @dir_files=<$dir/* $dir/.*>;

    假如尖括号即表示从文件句柄中读取有代表文件名通配操作,那Perl如何取舍?

    因为合理的文件句柄必须是严格意义上的Perl标识符,所以如果尖括号内满足Perl标识符条件的,就作为文件句柄来读取;否则就代表文件名通配符。如:

    上述规则唯一例外就是当尖括号内仅仅是一个简单的标量变量时,那么他就是间接文件句柄读取,其中变量的值就是带读取的文件句柄名称。

     

    目录句柄

    opendir(代替open) 打开目录句柄;

    readdir (代替readline)读取目录句柄的内容;

    closedir(代替close) 关闭目录句柄;

    对比:

    #!/usr/bin/env perl
    use 5.010;
    open AA,'<','aa';
    while(1){
        my $line=readline AA;
        if($line eq "")
        {
            last;#不知道为什么,用break出现了错误。
        }
        print "$line";
    }
    close AA;

     目录句柄的缺点:目录句柄返回的名称列表并未按照特定的顺序排列。同时列表中将包含所有文件,而不是匹配某些模式的部分(如:*.pm)。同时列表中包含了名称一点号开头的文件,.和..也在其中。所以如果我们只想处理名称以pm结尾的文件,则可以在玄幻内使用一个跳过函数:

    while($name=readdir $dh){

        next unless $name=~ /.pm$/; #处理名称以pm结尾的文件

        next if $name =~ /^./;#去掉以点号开头的文件

        .....其他对文件名的处理......

    }

    因为readdir操作符返回的只是文件名并不包含路径名,所以他们只是目录里的文件名而已。

    而有时候为了更加方便操作,也是更加清晰,使用下面的操作:

    递归访问目录(主要为了实现shell中的find命令操作)

    使用File::find模块。

    使用File::Find::Rule和File::Finder操作具有更好的用户界面和可操作姓。

    File::Find::Rule==>http://search.cpan.org/~rclamp/File-Find-Rule-0.33/lib/File/Find/Rule.pm;

    如:

    #!/usr/bin/env perl
    use 5.010;
    use File::Find::Rule;
    #say "INC==@INC";
    @DIR=qw (/home/lukexwang/PerlDemo);
    use lib '.';
    my @files=File::Find::Rule->file()
    ->name( '*.pl' )
    ->in(@DIR);
    say "@files";

     文件和目录的操作

    删除文件:unlink 

    unlink 'slate','bedrock','lava';

    unlink qw(slate bedrock lava);

    联合glob函数和unlink函数:

    unlink glob '*.o';==rm *.o;

    unlink的返回值代表成功删除的文件数目。

    只知道数目并不知道具体是删除了哪一个,如果一定要知道是删除了哪一个可以递归删除,如下面的语句:

    这个命令只能删除文件,不能删除目录(rmdir).

    重命名文件

    rename 'old','new';====>shell中的mv 命令

    既然和mv类似,那当然可以将文件移动到其他的目录下:

    很多人喜欢用胖箭头:

    新闻组中最常见的就是以.old结尾的文件改名为.new结尾。下面是代码:

    链接和文件

    硬链接:link 'chicken','egg' or warn "can't link chicken to egg:$!";#为egg创建连接chicken

    软链接:symlink 'dodgson','carroll' or warn "can't symlink dodgson to carroll:$!";

    要取得软链接指向的位置,使用readlink函数。他会指向软连接的位置,如果参数不是符号连接,则返回undef;

    创建和删除目录

    mkdir 'fred',0755 or warn "Cannot make fred directory:$!";#fred为名字,0775为权限

    注意不要漏了开头的0(代表八进制),否则就是10进制的755,这等于八进制的1363。

    注意下面的用法:

    系统会把0755当作十进制来处理,所以相当于我们用01363权限创建了一个目录;

    所以需要使用oct函数,他能强行把字符串当作八进制处理,无论其是否以0开头:

    删除目录:rmdir函数,用法类似于unlink函数。但是每次只能删除一个目录。

    注意:对于非空目录调用rmdir函数会导致失败。所以可以先用unlink删除目录中的内容,在试着移除已经清空的目录。

    这个方法并不是很好,如果是两层以上的目录,删除就必须用递归了。具体还不太懂,等着补充!!!

    $$是进程代号。

    修改权限

    chmod 0755,'fred','barney';

    但是不能用:+x 或者go=u-w等参数。

    修改隶属关系

    chown函数修改一系列文件的拥有者及其所属组。拥有者和所属组会被同时修改,并且指定时必须给出数字形式的用户标识符和组标识符。如:

    如果要处理的不是数字,而是想merlyn这样的字符串呢?该如何,使用getpwnam函数将用户名转换成用户编号,再使用getgrnam函数把用户组名转换成组编号:

  • 相关阅读:
    Entity Framework版本历史概览
    读书笔记—CLR via C#章节3
    读书笔记—CLR via C#章节1-2
    C#编程实践–产假方案优化版
    老调重弹--面向对象设计原则--包设计原则
    Redis(七)分布式锁
    Redis(九)高可用专栏之Sentinel模式
    Redis(九)高可用专栏之《简介篇》
    Redis(七)持久化(Persistence)
    Redis(六)管道(Pipelining)
  • 原文地址:https://www.cnblogs.com/lukexwang/p/4679214.html
Copyright © 2011-2022 走看看