zoukankan      html  css  js  c++  java
  • perl文件操作


    打开、关闭文件
       open (filevar, filename)
        filevar为文件句柄,或者说是程序中用来代表某文件的代号
        filename为文件名,其路径可为相对路径,亦可为绝对路径
    open(FILE1,"file1");
    open(FILE1, "/u/jqpublic/file1");


       打开文件时必须决定访问模式
    open(FILE1,"file1");
     read
     
    open(outfile,">outfile");
     write写模式将原文件覆盖,原有内容丢失
    open(appendfile, ">>appendfile");
     append
     

      
        open的返回值用来确定打开文件的操作是否成功,成功时返回非零值,失败时返回零:
    if (! open(MYFILE, "myfile")) {
        die ("cannot open input file file1\n");
        }
     
     open (MYFILE, "file1") || die ("Could not open file");


        close (MYFILE);

        例子.读文件并显示
    #!/usr/bin/perl

    &gotest("/home/macg/perltest/gogo");
    &gotest("/home/macg/www/index.html");
    &gotest("jk");

    sub gotest{
    my(@tmp)=@_;
    open (MYFILE, $tmp[0]) || die ("Could not open file");
    @array = <MYFILE>;      此句不是读一行,而是读整个文件
    foreach (@array) {
     print $_;
       }
    close(MYFILE);
    }
     
    [macg@localhost perltest]$ ./tip.pl
    kkkkk               第一个文件gogo读出

    第二个文件index.html读出
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <frameset rows=20%,*>
      <frame src="title.html" frameborder="no" scrolling="no">
      <frameset cols=30%,*>
        <frame src="index-left.htm" frameborder="no" name="left">
        <frame src="main-right.html" frameborder="no" name="right">
      </frameset>
    </frameset>

    第三个文件jk不存在,程序走die语句
    Could not open file at ./tip.pl line 9
     

     
        打开管道文件--------操作非常简单,就是以带管道符号的命令作为文件名字符串
        执行一个管道命令
        假设管道命令创建一个临时文件
        再OPEN这个临时文件到句柄
    [macg@localhost perltest]$ vi tip.pl
    #!/usr/bin/perl

    &gotest("ls -l |");

    sub gotest{
    my(@tmp)=@_;
    open (MYFILE, $tmp[0]) || die ("Could not open file");
    @array = <MYFILE>;
    foreach (@array) {
     print $_;
          }
    close(MYFILE);
    }
     
    [macg@localhost perltest]$ ./tip.pl
    total 16
    -rw-rw-r--  1 macg macg   6 Mar 16 13:06 gogo
    -rwxrwxr-x  1 macg macg 192 Mar 17 16:53 tip.pl
     

        读文件
    $line = <MYFILE>;
     读一行
    并把文件指针向后移动一行
     
    @array = <MYFILE>;
     读全部
    文件的每一行(含回车符)为@array的一个字符串元素
     
    最简单的显示文件 @array = <MYFILE>;      一次读整个文件,读入一个字符串数组

    foreach (@array) {            再打印字符串数组的每一个元素(每一行)
     print $_;
          }
     
    [macg@localhost perltest]$ ./tip.pl
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <frameset rows=20%,*>
      <frame src="title.html" frameborder="no" scrolling="no">
      <frameset cols=30%,*>
      </frameset>
    </frameset>
     
    my($line);
    while ($line=<MYFILE>) {循环读一行,读不出就为NULL(0)
     print $line; 
     }
     


        $line =<STDIN> ;      从键盘读一行
    ,类似C的gets();
     

        chomp 函数,截去变量尾端的\n换行,常与键盘输入合用,方法有二種:
    1    $yourans=<STDIN>;
          chomp $yourans;
     
    2    chomp ($yourans=<STDIN>);
     


       注意:一定不要用while (chomp($line=<MYFILE>)),因为chomp总是返回0值,和while($line=<MYFILE>)是不同的
    while($line=<MYFILE>){
    chomp($line);  把 chomp放在循环里边


     
     

       <> 和 <STDIN> 的区别
    先说相同点:都支持标准输入读取
    不同点:<> 可以将输入定向到命令行参数
    vi  readfile.pl
    #! /usr/bin/perl
    while (<>) {
        print;
    }
     
    ./readfile.pl index.html    就是读取第一个命令行参数所指的文件
    ./readfile.pl               如果不带任何参数执行,就是由标准输入STDIN读取
     

     
       写文件     print/printf  句柄 (字串);
    open(OUTFILE, ">outfile");
    print OUTFILE ("Here is an output line.\n");
     
    print STDERR ("File file1 exists.\n");
    print STDOUT ("File file1 exists.\n");
     


        最简单的文件COPY
    #!/usr/bin/perl
    &gotest("ls -l |","test");

    sub gotest{
    my(@tmp)=@_;
    open (READFILE, $tmp[0]) || die ("Could not open file");
    open (WRITEFILE, ">".$tmp[1]) || die ("Could not open file");
    my($line);
    while ($line=<READFILE>) {
     print WRITEFILE $line;
      }
    close(READFILE);
    close(WRITEFILE);
     }
     
    [macg@localhost perltest]$ ./tip.pl
    [macg@localhost perltest]$ ls
    gogo  test  tip.pl
    [macg@localhost perltest]$ cat test
    -rw-rw-r--  1 macg macg   6 Mar 16 13:06 gogo
    -rwxrwxr-x  1 macg macg 297 Mar 17 17:43 tip.pl
     
        上例同时也是一次管道文件的建立,相当于ls –l >test


        -e  文件是否存在        -d 目录是否存在
    #!/usr/bin/perl

    chomp($file=<>);
    &gotest($file);

    sub gotest{
    my(@tmp)=@_;
    if (-e $tmp[0]) {
      print "file is exist\n";
     } else { print "file not found\n"; }
    }
     
    [macg@localhost perltest]$ ./tip.pl
    gogo
    file is exist
    [macg@localhost perltest]$ ./tip.pl
    kd
    file not found
     

    #!/usr/bin/perl

    chomp($file=<>);
    &gotest($file);

    sub gotest{
    my(@tmp)=@_;
    if (-d $tmp[0]) {
      print "directory is exist\n";
     } else { print "directory not found\n"; }
    }
     
    [macg@localhost perltest]$ ls -F
    gogo  test  testdir/  tip.pl*

    [macg@localhost perltest]$ ./tip.pl
    kj
    directory not found
    [macg@localhost perltest]$ ./tip.pl
    testdir
    directory is exist
     

     

    if (!-e $file)      如果文件不存在

        -r,-w,-x 权限
    if (-w $file) {
        print "$file 写权限!\n";
    }
      
    if (-x $file) {
        print "$file 读权限!\n";
    }  


       -z是否为空文件,-s是否非空
    if (-z $tmp[0]) {
      print "file is empty\n";
     }
     
    if ($len= -s $tmp[0]) {  -s不仅能判断文件非空,还兼有计算文件大小的工作
     print "file length is $len \n";
      }
     
    [macg@localhost perltest]$ touch pp
    [macg@localhost perltest]$ ./tip.pl
    pp
    file is empty

    [macg@localhost perltest]$ ./tip.pl
    gogo
    file length is 6 
     
     

    -l  是否为符号链接

    -T  是否为文本文件


       基本文件操作

    删文件

    #!/usr/bin/perl

    chomp($file=<>);
    &gotest($file);

    sub gotest{
    my(@tmp)=@_;
    my($len);
    unlink $tmp[0] if -e $tmp[0];
    }
     
    [macg@localhost perltest]$ ls
    go  test  testdir  tip.pl

    [macg@localhost perltest]$ ./tip.pl
    go

    [macg@localhost perltest]$ ls
    test  testdir  tip.pl
     
    [macg@localhost perltest]$ ls
    dd  test  testdir  tip.pl

    [macg@localhost perltest]$ ./tip.pl
    /home/macg/perltest/dd           全路径删除

    [macg@localhost perltest]$ ls
    test  testdir  tip.pl


    rename("原文件名", "新名");
    #!/usr/bin/perl
    &gotest("gogo","dd");

    sub gotest{
    my(@tmp)=@_;
    rename($tmp[0],$tmp[1]);
    }
     
    [macg@localhost perltest]$ ls
    gogo  pp  test  testdir  tip.pl

    [macg@localhost perltest]$ ./tip.pl

    [macg@localhost perltest]$ ls
    dd  pp  test  testdir  tip.pl
     

        取文件属性,共13个属性
    #!/usr/bin/perl

    chomp($file=<>);
    &gotest($file);

    sub gotest{
    my(@tmp)=@_;
    my(@sta)=stat($tmp[0]);
    my($j);
    for($j=0;$j<13;$j++) {
     print "no.$j is $sta[$j] \n";
      }
    }
     
    [macg@localhost perltest]$ ls
    test  testdir  tip.pl
    [macg@localhost perltest]$ ./tip.pl
    test
    no.0 is 770
    no.1 is 809748
    no.2 is 33204
    no.3 is 1
    no.4 is 500      uid
    no.5 is 500
    no.6 is 0
    no.7 is 103     length文件大小
    no.8 is 1174127246
    no.9 is 1174124625
    no.10 is 1174124625
    no.11 is 4096
    no.12 is 16  
     
     


        文件copy命令              必须先use模块File
    #!/usr/bin/perl

    chomp($file=<>);
    chomp($file2=<>);
    &gotest($file,$file2);

    sub gotest{
    my(@tmp)=@_;
    use File::Copy;     在perl主目录下查找File/Copy.pm

    copy($tmp[0], $tmp[1]);
    }  
     
    [macg@localhost perltest]$ ./tip.pl
    test
    newtest
    [macg@localhost perltest]$ ls
    newtest  test  testdir  tip.pl 


     
    [root@localhost perltest]# ls -F /usr/lib/perl5/5.8.6/File
    Basename.pm  CheckTree.pm  Compare.pm  Copy.pm  DosGlob.pm  Find.pm  Path.pm  Spec/  Spec.pm  stat.pm  Temp.pm


       目录操作
      chdir("testdir") || die "$!";
      mkdir($dir, 0755)  || die "$!";
      rmdir("testdir") || die "$!";
    #!/usr/bin/perl

    chomp($directory=<>);
    chomp($choice=<>);
    &gotest($directory,$choice);

    sub gotest{
    my(@tmp)=@_;

    if($tmp[1]) {
    mkdir($tmp[0], 0755)  || die "$!";
       } else {
    rmdir($tmp[0]) || die "$!";
         }
    }
     
    [macg@localhost perltest]$ ./tip.pl
    newdir
    1
    [macg@localhost perltest]$ ls -F
    newdir/  newtest  test  testdir/  tip.pl*  
    [macg@localhost perltest]$ ./tip.pl
    testdir
    0
    Directory not empty at ./tip.pl line 13, <> line 2
    rmdir的die信息
     

       改变文件属性和所属(需在root下才能起作用。换句话说,这是必须在ROOT下执行的PERL语句)
    chmod(0755, "file1.txt", "file2.txt"); 
     
    $uid=500;
    $gid=500;
    chown($uid, $gid, "file1.txt", "file2.txt");  
     

  • 相关阅读:
    一文告诉你,为什么要研究JVM原理
    高并发中使用到的RateLimiter源码解析
    WEB应用服务架构的演变(扫盲)
    网上安全方面的涉及到的方面(详解)
    JDK安装
    JDKJRKSDK的区别
    本地同时安装oracle客户端与服务端的注意事项
    WMS不同货主的货如何管理
    LeetCode 101
    WMS一物一码、唯一码
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2031140.html
Copyright © 2011-2022 走看看