zoukankan      html  css  js  c++  java
  • Perl 学习笔记-目标操作

    1.在目录树中移动.

      程序运行时会以当前工作目录作为相对路径的起点, 可以使用  chdir 操作符改变当前目录:

    chdir "/etc" or die "Can't chdir to /etc:$!"; #因为这是一个相对操作系统的调用, 所以错误信息会返回到 $! 中.

      由Perl程序启动的所有进程都会继承Perl程序的工作目录. 但对于启动Perl的进程,它的工作目录不会随Perl工作目录的改变而改变, 所以无法写出任何Perl程序来代替Shell里的cd命令.因为一旦退出Perl程序, 又会回到开始的工作目录.

      如果省略参数, 将回到用户主目录, 这是少数不以$_作为默认参数的情形之一.

    2. 文件通配名(globbing)

      命令行里: shell会将命令行里的文件名模式展开成所有匹配的文件名, 称为文件名通配, 如 echo *.txt  名令echo并不知道如何展开*txt, 因为shell会将它展开, 在Perl中也同样适用.

      Perl程序中: 适用 glob 操作符进行文件名通配.  my @all_files = glob "*"; #所有文件   my @pm_files = glob "*.pm"; 

      glob 不会匹配以 . 号开头的文件名, 任何能在命令行上键入的模式都能作为参数交给glob处理, 如果要一次匹配多种模式,可以在参数中用空格隔开各个模式:  my @all_files_including_dot=glob ".* *"; 

      在glob操作符之前的方式: 使用尖括号语法 my @all_files=<*>;  和双引号字符串内插的情形类似, 尖括号内的变量也会被替换为当前变量的值, 然后按照文件名通配展开成对应的文件名列表.

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

      联想到<STDIN>表示从文件句柄读取, 那么Perl怎么区分是文件名通配还是从文件句柄读取呢? => 规则: 如果尖括号内是满足Perl标识符条件的,就作为文件句柄读取, 否则代表使用文件名通配操作.

    my @files = <FRED/*>; ## glob
    my @lines = <FRED>;   ## 从文件句柄
    my $name = "FRED";
    my @files = <$name/*> ## glob
    my @files2 = <$name>  ## $name是简单标量变量, 不是数组或哈希, 所以也是对文件句柄的读取,Perl是在编译时确定的, 所以和变量的内容无关  

    3. 目录句柄

      与文件句柄类似, 只是操作符和内容不同

      使用 opendir 代替文件句柄操作符 open 

      使用 readdir 代替文件句柄操作符  readline 

      使用 closedir 代替文件句柄操作符  close 

      读取到的是目录里的文件名和子目录名 , 而不是文件的内容.

    my $dir_to_process = ".";
    opendir DH, $dir_to_process or die "Can't! $!
    ";
    foreach $file(readdir DH){
        print "$file
    ";
    }
    closedir DH;

      和文件句柄一样, 目录句柄会在程序结束时自动关闭, 也会在用这个句柄再打开另一个目录前自动关闭.

    4.文件操作

      删除:在Perl中使用 unlink 操作符来将文件放入碎纸机,类似于Linux中的rm命令,参数是列表,返回成功地删除了多少个文件,可以配合通配符glob使用,实现一次删除多个文件。执行失败时信息保存在变量 $!

        重命名: rename 函数,类似mv命令,参数为列表。执行失败返回假,信息保存在$!中,通常使用 or die(或 or warn)来报告

     5.建立和删除目录(每次只能操作一个)

      建立目录 mkdir ,可以在创建目录时指定权限,如果权限是字符串,要用otc函数处理

    my $name = "roger";
    my $perssions = "0755";
    mkdir $name , oct($perssions) or warn "Can't make directory $name : $!";

         删除目录 rmdir ,删除非空目录将会失败。可以先用unlink删除目录里面的目录。创建临时目录最好包含当前进程标识符,这个代号放在 $$ 变量中,这么做什可以防止和别的进程冲突。

      删除目录树:使用模块 File::Path 

    use File::Path qw(make_path remove_tree);
    
    # 创建任意深度的目录树
    # make_path($dir1,dir2,...)
    make_path('roger/bar/zoo','rog/dsd');
    make_path("roger/bar/zar","roger/dst/r",{ #实际过程中是一层一层创建的
        verbose => 1,
        error => my $roger, #为什么要使用反斜杠
        mode => 0711,
        });
    
    # 删除任意深度的目录树,如果目录非空会先unlink文件
    remove_tree('roger/bar/zar','roger/dst/r',{
        verbose => 1,
        error => my $err_list,
        });

      修改文件或目录权限: chmod 

      更改隶属关系:  chown 

      修改时间戳: utime :可以修改某个文件的最近访问时间来造假

  • 相关阅读:
    内置函数(少量)
    画国旗(尺寸不标准)
    测试题——程序
    乱码笔记2--字典
    列表
    课堂笔记 ——————乱
    如何利用pip安装国内镜像源
    pip常用指令
    pip卸载
    pip简介
  • 原文地址:https://www.cnblogs.com/roger9567/p/4543603.html
Copyright © 2011-2022 走看看