perl:路径构建
#!/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.
我不能完全肯定这是怎么回事就在这里,因为你的代码是小于完全可读。
- 做
use strict;
- 做
use warnings;
- 不要使用变量和子程序名称是可读的话,而不是用缩写
我怀疑你的主要问题之一乱丢你的代码试图重用同一个文件句柄(DIR
)一遍又一遍地重复(包括在完成之前为新目录重新打开它)。
改为使用词法范围的文件句柄。
更好的是,忘记使用opendir
为此,只需要使用CPAN模块,如Path::Class(根据my answer to a similar question)。
@ above.i做了所有修改,但错误仍然存在... – user563577 2011-01-05 09:33:25
向我们展示更新后的代码(并注意,要点是让您更容易发现代码问题而不是解决方案的事情。是最后一句话,这需要批量重写,使其不太可能会有相同的错误) – Quentin 2011-01-05 09:35:23
如果我删除最后一个开放语句...我能够得到文件夹路径 – user563577 2011-01-05 09:48:23
注:
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;
}
什么是线47 49?你想做什么 ?严格使用;使用警告; ... – Toto 2011-01-05 08:56:22