免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: systemalgorithm

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

论坛徽章:
0
发表于 2007-09-30 10:26 |显示全部楼层
当函数调用自己时,在栈中为新的局部变量和参数分配内存,函数的代码用这些变量和参数重新运行。递归调用并不是把函数代码重新复制一遍,仅仅参数是新的。当每次递归调用返回时,老的局部变量和参数就从栈中消除,从函数内此次函数调用点重新启动运行。可递归的函数被说成是对自身的“推入和拉出”。

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

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

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

[ 本帖最后由 systemalgorithm 于 2007-9-30 10:35 编辑 ]

论坛徽章:
0
发表于 2007-09-30 10:35 |显示全部楼层
是啊,my修饰的变量的作用范围是lexical的,read_dir中不可见

论坛徽章:
0
发表于 2007-09-30 22:08 |显示全部楼层
原帖由 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;
}


[ 本帖最后由 Lonki 于 2007-10-13 18:04 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2007-10-01 09:21 |显示全部楼层
多谢LZ分享啊。不错,晚上调试一下看看。

论坛徽章:
0
发表于 2007-10-09 09:59 |显示全部楼层
原帖由 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.

论坛徽章:
0
发表于 2007-10-13 18:06 |显示全部楼层
To 楼上:
能否给个简单的exception?
目前测下来Ok的...

论坛徽章:
0
发表于 2007-10-14 15:07 |显示全部楼层

回复 #16 Lonki 的帖子

弄个测试文件就行了啊?
文件夹下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试试

论坛徽章:
0
发表于 2007-10-14 17:03 |显示全部楼层
原帖由 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

论坛徽章:
0
发表于 2007-10-15 13:35 |显示全部楼层

回复 #1 systemalgorithm 的帖子

是个实用程序。

论坛徽章:
0
发表于 2007-10-16 13:56 |显示全部楼层
难道不是很大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP