2011-01-05 5 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: path construction

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

ответ

2

Я не совсем уверен, что здесь происходит, так как ваш код меньше, чем полностью читаемым.

  • ли use strict;
  • ли use warnings;
  • ли использовать переменные и подпрограммы имена, считываемых слов вместо замусоривание кода с сокращениями

Я подозреваю, что один из ваших основных проблем, пытается повторно один и тот же дескриптор файла (DIR) (включая повторное открытие его для нового каталога, прежде чем вы закончите с ним для предыдущего).

Вместо этого используйте лексические файловые дескрипторы.

Еще лучше, забудьте об использовании opendir, просто зайдите с модулем CPAN, таким как Path::Class (согласно my answer to a similar question).

+0

@ выше.i сделал все изменения, но ошибка сохранилась ... – user563577

+1

Покажите нам обновленный код (и обратите внимание, что маркеры - это то, что облегчит поиск проблем с вашим кодом, а не с решениями. последнее предложение, которое требует оптовой перезаписи, что маловероятно, что у вас будут те же ошибки) – Quentin

+0

, если я удалю последний открытый оператор ... Я могу получить путь к папке – user563577

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; 
}