2011-01-05 219 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; 
}