LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1336|回复: 1

Perl Recursive subroutine problem

[复制链接]
发表于 2006-6-22 02:05:15 | 显示全部楼层 |阅读模式
下面这段代码拷贝一个目录到另一个目录时,($src ==> $dst)
当源目录有多个子目录的时候,程序执行完毕以后目标目录仅拷贝了一个源目录的子目录,为什么呀?

举个例子:
src_top有三个子目录src_sub[123],执行
$ ./mcp src_top dst_top
之后,dst_top下可能仅有一个src_sub1目录,其余的两个子目录漏掉了,哪位达人解释一下啊?感激不尽!


[PHP]
#!/usr/bin/perl -w

use warnings;
use strict;

my $srcdir;
my @dstdirs;
my $dstdir;

sub copy_file {
  my ($infile, $outfile) = @_;
  my ($mode) = ();
  
  if(!open (INFILE, $infile)){
    warn "unable to open file $infile for reading, error: $!\n";
    return -1;
  }

  ($mode) = (stat($infile))[2];

  if(!open(OUTFILE, ">$outfile")){
    warn "unable to open file $outfile for writing, error: $!\n";
    close(INFILE);
    return -1;
  }
  
  chmod($mode, $outfile);

  while(defined(($_ = <INFILE>))){
    print OUTFILE $_;
  }

  close(OUTFILE);
  close(INFILE);

  return 0;
}


sub copy_dir {
  my ($src, $dst) = @_;
  my ($mode) = ();
  my ($infile, $outfile) = ();
  my ($srcpath, $dstpath) = ();

  if(!opendir(IND, $src)){
    warn "unable to open directory $src for reading, error: $!\n";
    return -1;
  }

  ($mode) = (stat($src))[2];
  if(! -d $dst){
    if(!mkdir($dst, $mode & 0777)){
      warn "unable to create directory $dst, error: $!\n";
      return -1;
    }
  }

  while(defined($infile = readdir(IND))){
    if($infile eq "." || $infile eq ".."){
      next;
    }

    $srcpath = sprintf("%s/%s", $src, $infile);
    $dstpath = sprintf("%s/%s", $dst, $infile);

    if(-f $srcpath){
      copy_file($srcpath, $dstpath);      
    } elsif(-d $srcpath){
      copy_dir($srcpath, $dstpath);
    } else {
      warn "skiping non-regular file $srcpath\n";
    }
  }

  close(IND);
  
  return 0;
}

if($#ARGV + 1 < 2){
  die "*** usage: mcp srcdir tgdir1 tgdir2 ... tgdirn ***\n";
}

($srcdir, @dstdirs) = @ARGV;

foreach $dstdir (@dstdirs){
  copy_dir($srcdir, $dstdir);
}


[/PHP]
发表于 2006-8-10 12:53:17 | 显示全部楼层
我认为你的IND被覆盖了。
当IND是src_top时,打开src_sub1时,IND被关闭,重新定义为src_sub1。所以当recursion推回时IND已经面目全非了。

目前没想出好的解决方法。用system("cp -r $src $dst");吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表