写一个perl解压缩的程序能彻底解压一个.tar.gz文件【附上程序代码】

当函数调用自己时,在栈中为新的局部变量和参数分配内存,函数的代码用这些变量和参数重新运行。递归调用并不是把函数代码重新复制一遍,仅仅参数是新的。当每次递归调用返回时,老的局部变量和参数就从栈中消除,从函数内此次函数调用点重新启动运行。可递归的函数被说成是对自身的“推入和拉出”。

编程还是得用: use strict;的好。 一调试就知道原因了。

原来程序是把$refiles当做全局变量了,函数unzipfile里的$refiles根本不启什么作用。所以在unzipfile里每次都能记住$refiles, -> $all_files的值。

搞定。看来编程调试得用 -w, use strict;

是啊,my修饰的变量的作用范围是lexical的,read_dir中不可见


QUOTE:
原帖由 systemalgorithm 于 2007-9-29 16:10 发表
程序要求是:
unzip.pl   input.tar.gz


input.tar.gz 文件里还有a.tar.gz;b.tar.gz文件; a.tar.gz文件里还有.tar, .jar文件。

这个程序的目的就是要把input.tar.gz文件里的所有可以解压的tar/jar/tar. ...

写了个, 测试下来暂时OK
use strict;
use warnings;

############# Main Begin ################

if ($ARGV[0]) {
    &deep_unzip($ARGV[0]);
}
else {
    print "Usage: DeepUnzip.pl 'file1' 'file2' 'filen'\n";
}

############# Main End ##################


### unzip the target recursively
sub deep_unzip {
    my $target = shift;
   
    if ($target =~ /\.jar$/i) {
        print "jar -xf $target\n";
        system("jar -xf $target");
        $target =~ s/\.jar$//i;
    }
    elsif ($target =~ /\.tar$/i) {
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
    elsif ($target =~ /\.tar\.gz$/i) {
        print "gunzip -f $target\n";
        system("gunzip -f $target");
        $target =~ s/\.gz$//i;
        
        print "tar -xf $target\n";
        system("tar -xf $target");
        $target =~ s/\.tar$//i;
    }
   
    # unzip the new files recursively
    if (-d $target) {
        print "cd $target\n";
        chdir($target);
        my @new_files = glob "*";
        foreach (@new_files) {
            &deep_unzip($_);
        }
        print "cd ..\n";
        chdir('..');
    }
}


如果一定需要is_ar和is_tar_gz的话, 这样就可以了:
### Check if it is .jar .tar
sub is_ar {
    $_[0] =~ /\.[jt]ar$/i;
}

### Check if it is .tar.gz
sub is_tar_gz {
    $_[0] =~ /\.tar\.gz$/i;
}


多谢LZ分享啊。不错,晚上调试一下看看。


QUOTE:
原帖由 Lonki 于 2007-9-30 22:08 发表



写了个, 测试下来暂时OK
#!/usr/bin/perl

use strict;
use warnings;

############# Main Begin ################
&deep_unzip($ARGV[0]);
############# Main End #################

### u ...

Your script doesn't work once the same directory has many .tar.gz files, please check it.
To 楼上:
能否给个简单的exception?
目前测下来Ok的...
弄个测试文件就行了啊?
文件夹下a下有:
b.tar.gz
c.tar.gz
d.tar.gz
e.tar
f.jar
g.txt
hd/ccc.txt
hd/ddd.txt

tar cf a.tar a/
gzip a.tar

然后用程序解压a.tar.gz试试


QUOTE:
原帖由 systemalgorithm 于 2007-10-14 15:07 发表
弄个测试文件就行了啊?
文件夹下a下有:
b.tar.gz
c.tar.gz
d.tar.gz
e.tar
f.jar
g.txt
hd/ccc.txt
hd/ddd.txt

tar cf a.tar a/
gzip a.tar

然后用程序解压a.tar.gz试试

测下来OK的.. 我是说你之前遇到的exception的test case
是个实用程序。
难道不是很大。