zoukankan      html  css  js  c++  java
  • 分享:perl 文件操作总结

    发布:thebaby 来源:net 【大 中 小】

    perl 文件操作,包括打开、关闭文件,读取、定入文件等。
    原文链接:http://www.jbxue.com/article/3153.html

    打开、关闭文件
    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
    ");
    }
    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(0print $line; 
    }
    
    $line =<STDIN> ; 从键盘读一行,类似C的gets();

    chomp 函数,截去变量尾端的 换行,常与键盘输入合用,方法有二種:

    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读取

    有关perl 文件操作总结的内容,读到这里,是不是有种越种越清晰的感觉了呢?!
    Let's go!

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

    最简单的文件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 ";
    } else { print "file not found "; }
    }

    [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 ";
    } else { print "directory not found "; }
    }

    [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 写权限! ";
    }

    if (-x $file) {
    print "$file 读权限! ";
    }

    -z是否为空文件,-s是否非空
    if (-z $tmp[0]) {
    print "file is empty ";
    }
    if ($len= -s $tmp[0]) { -s不仅能判断文件非空,还兼有计算文件大小的工作
    print "file length is $len ";
    }
    [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] ";
    }
    }

    [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");

    本文原始链接:http://www.jbxue.com/article/3153.html

  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/study100/p/3384050.html
Copyright © 2011-2022 走看看