Arrays 在Perl中找不到数组中空值的源

Arrays 在Perl中找不到数组中空值的源,arrays,perl,Arrays,Perl,我已经用很多方法将代码剥离到最基本的部分,试图找出为什么数组中的第一个值是空的,我被难住了。我有一个目录和文件数组。如果是一个目录或文件,其名称包含某个字符串(如“conf”),我不感兴趣。如果是其他内容,我将其写入屏幕并将其推送到数组对象 然后,我循环遍历数组并将每个条目写入屏幕。这就是我想要做的。当我在第一部分查看打印到屏幕上的内容时,信息与我预期的一样。当我打印出数组中的条目时,输出总是在数组的第一个索引中有一个空字符串或没有任何内容 这是我的密码: sub scrubFiles { #

我已经用很多方法将代码剥离到最基本的部分,试图找出为什么数组中的第一个值是空的,我被难住了。我有一个目录和文件数组。如果是一个目录或文件,其名称包含某个字符串(如“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
将/tmp/mydirectory/ifconfig.txt添加到@filelist
将/tmp/mydirectory/history\u comp.txt添加到@filelist
将/tmp/mydirectory/myctl.txt添加到@filelist
将/tmp/mydirectory/ls-l.txt添加到@filelist
将/tmp/mydirectory/opt/comp/VERSION添加到@filelist
文件名:|结束
文件名:/tmp/mydirectory/ifconfig.txt | END
文件名:/tmp/mydirectory/history_comp.txt | END
文件名:/tmp/mydirectory/myctl.txt | END
文件名:/tmp/mydirectory/ls-l.txt | END
文件名:/tmp/mydirectory/opt/comp/VERSION | END
我尝试使用“ref()”来找出位置0中的实际内容,但它对数组中的每个条目都不返回任何内容


你知道我怎样才能得到这个空白条目吗?

你以前的代码已经正确地定义了变量的范围。你弄坏了。通过使用全局变量,我们必须查看程序中的每一行,以了解发生了什么。那太愚蠢了


首先,返回给您的代码,以撤销您引入的两个bug。在sub中声明
@filelist
,并实际使用sub返回的列表。

使用
use strict编译代码时会发生什么(和
使用警告;
)?
scrubFiles
中引用的数组
@filelist
似乎是某种全局变量;无论如何,它不是函数中的
my
变量。我想知道它是否是用空条目预初始化的?在调用
scrubFiles
之前,您是否尝试过对(@filelist){print“Before$\n”}
执行
?如果从
scrubFiles
返回数组,为什么要忽略返回的值?这非常有帮助,让我找到了问题所在。我在程序的前面已经“初始化”了数组。谢谢@约翰纳森利弗勒的评论和你的回答让我走上了正确的轨道。非常感谢你。多么愚蠢的错误。不,不是愚蠢的错误,一个很容易犯的错误。这就是在变量范围上更加保守的全部意义——限制你可能犯的太容易的错误。@ysth,我想他的意思是他做了
my@filelist=''他本可以在替补中轻松完成,但你的观点仍然站得住脚。