【问题标题】:Unable to locate source of empty value in an array in Perl无法在 Perl 的数组中找到空值的来源
【发布时间】: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返回数组,为什么忽略返回值?
  • 这很有帮助,让我找到了问题所在。我在程序的前面已经“初始化”了数组。谢谢!

标签: arrays perl


【解决方案1】:

您之前的代码具有适当范围的变量。你打破了那个。通过回到使用全局变量,我们必须查看程序中的每一行才能知道发生了什么。那太愚蠢了。

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

【讨论】:

  • @JohnathanLeffler 的评论和您的回答让我走上了正轨。太感谢了。多么愚蠢的错误。
  • 不,这不是一个愚蠢的错误,一个太容易犯的错误。这就是对变量范围更保守的全部意义——限制你可能犯的太容易的错误。
  • @ysth,我认为他的意思是他做到了my @filelist = '';,他可以在潜艇中轻松做到这一点,但你的观点仍然存在。
猜你喜欢
  • 2017-10-25
  • 2018-03-25
  • 2014-07-28
  • 2022-12-10
  • 1970-01-01
  • 2010-12-27
  • 2021-08-14
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多