2011-01-05 141 views
0
#!/usr/bin/perl -w 
$n1=$ARGV[0]; 
$n1 =~ s/\\/\//g; 
$dir=$n1; 

$n1=&listing; 

sub listing{ 
    opendir(DIR, $dir) or die $!; 
    while (my $file = readdir(DIR)) { 

     # A file test to check that it is a directory 
     # Use -f to test for a file 

     next unless (-d "$dir/$file"); 
     if($file =~ m/^[a-zA-Z]/) { 
      @dir_list=$file; 
     } 
     foreach $va(@dir_list){ 
      #print $va."NEW DIR \n"; 
      @md_dir=$va; 
     } 
     add_path(@md_dir); 
    } 
    closedir(DIR); 
} 

sub add_path(@md_dir) { 
    foreach $vm(@md_dir) { 
     $p=$n1."/$vm"; 
    } 
    @mydir=$p; 
    add_infor(@mydir); 
} 

sub add_infor(@mydir) { 
    foreach $myfil(@mydir) { 
     print $myfil; 
     print "\n"; 
     opendir(DIR,$myfil)||die("cannot open"); 
    } 
} 

是我的代码....在那里我通过命令行的路径....我得到的目录列表.....我追加到orignal路径来打开列出目录.. 但错误是perl:路径构建

Use of uninitialized value in print at 1.pl line 47. 

Use of uninitialized value in opendir at 1.pl line 49. 
cannot open at 1.pl line 49. 
+4

什么是线47 49?你想做什么 ?严格使用;使用警告; ... – Toto 2011-01-05 08:56:22

回答

2

我不能完全肯定这是怎么回事就在这里,因为你的代码是小于完全可读。

我怀疑你的主要问题之一乱丢你的代码试图重用同一个文件句柄(DIR)一遍又一遍地重复(包括在完成之前为新目录重新打开它)。

改为使用词法范围的文件句柄。

更好的是,忘记使用opendir为此,只需要使用CPAN模块,如Path::Class(根据my answer to a similar question)。

+0

@ above.i做了所有修改,但错误仍然存​​在... – user563577 2011-01-05 09:33:25

+1

向我们展示更新后的代码(并注意,要点是让您更容易发现代码问题而不是解决方案的事情。是最后一句话,这需要批量重写,使其不太可能会有相同的错误) – Quentin 2011-01-05 09:35:23

+0

如果我删除最后一个开放语句...我能够得到文件夹路径 – user563577 2011-01-05 09:48:23

3

注:

sub add_path(@md_dir) { 
    foreach $vm(@md_dir) { 
     $p=$n1."/$vm"; 
    } 
    @mydir=$p; 
    add_infor(@mydir); 
} 

这不是功能如何在Perl接收参数。调用该函数的参数位于@_数组中。

这个功能的目的不是很清楚。

你似乎也宽泛地分配使用@array = $scalar。而且,虽然这不会产生任何错误(并且在某些情况下可能是正确的),但我认为您真正想要的是push @array, $scalar

下应该能够为您提供一个起点:

#!/usr/bin/env perl 

use warnings; use strict; 
use File::Spec::Functions qw(catfile); 

my ($top) = @ARGV; 
$top = '.' unless defined $top; 

listing($top); 

sub listing { 
    my ($dir) = @_; 

    opendir my $dir_h, $dir 
     or die "Cannot open '$dir': $!"; 

    my @md_dir; 

    while (defined(my $entry = readdir $dir_h)) { 
     next if $entry =~ /^[.][.]?\z/; 

     my $path = catfile $dir, $entry; 
     next unless -d $path; 

     push @md_dir, $path if $entry =~ /^[a-zA-Z]/; 
    } 

    closedir $dir_h; 

    print "$_\n" for @md_dir; 
    return; 
}