【发布时间】:2012-12-26 12:13:02
【问题描述】:
我已经以多种方式将我的代码剥离到最基本的部分,试图找出为什么我的数组中的第一个值是空白的,我很困惑。我有一系列目录和文件。如果它是名称包含某个字符串(如“conf”)的目录或文件,我不感兴趣。如果是其他内容,我将其写入屏幕并将其推送到数组对象。
然后,我遍历数组并将每个条目写入屏幕。这就是我想要做的。当我查看第一部分打印到屏幕上的内容时,信息与我预期的一样。当我打印出数组中的条目时,输出总是有一个空字符串,或者在数组的第一个索引中没有任何内容。
这是我的代码:
sub scrubFiles { # Parse through interesting directories for interestingly named files
my $wanted = sub {
if (-d $_) {
print "Directory and will not be inserted into the files array: $_\n"
return;
};
if ($_ =~ /\.(?:yaml|bak|conf|cfg)\z/i) {
print "Not desirable and will not be inserted into the files array: $_\n";
return;
};
print ("Adding $_ to \@filelist\n");
push @filelist, $File::Find::name;
};
find( {wanted => $wanted, no_chdir=>1}, @_ ); # WILL NOT work properly without no_chdir
return @filelist;
}
&scrubFiles("/tmp/mydirectory/");
for (@filelist) { print "File name: $_|END\n"; }
推送到数组时,我得到以下输出。 “<...>”是我刚刚删除的输出,因为它无关紧要。 “添加”部分正是我所期望的。在第一个“添加”打印到屏幕之前没有任何内容。当它到达“文件名”部分时,它完全符合我的预期,除了打印到屏幕上的数组中的第一个条目是空白的,如您在此处看到的:
Adding /tmp/mydirectory/ifconfig.txt to @filelist
Adding /tmp/mydirectory/history_comp.txt to @filelist
Adding /tmp/mydirectory/myctl.txt to @filelist
Adding /tmp/mydirectory/ls-l.txt to @filelist
<...>
Adding /tmp/mydirectory/opt/comp/VERSION to @filelist
File name: |END
File name: /tmp/mydirectory/ifconfig.txt|END
File name: /tmp/mydirectory/history_comp.txt|END
File name: /tmp/mydirectory/myctl.txt|END
File name: /tmp/mydirectory/ls-l.txt|END
<...>
File name: /tmp/mydirectory/opt/comp/VERSION|END
我已经尝试使用“ref()”来确定位置 0 中的实际内容,但它不会为数组中的每个条目返回任何内容。
有什么想法可以让我得到这个空白条目吗?
【问题讨论】:
-
当你用
use strict;(和use warnings;)编译你的代码时会发生什么?scrubFiles中引用的数组@filelist似乎是某种全局变量;无论如何,它不是函数中的my变量。我想知道它是否正在使用空条目进行预初始化?在致电scrubFiles之前,您是否尝试过for (@filelist) { print "Before $_\n"; }?如果从scrubFiles返回数组,为什么忽略返回值? -
这很有帮助,让我找到了问题所在。我在程序的前面已经“初始化”了数组。谢谢!