my @array = undef;
while (@array = undef){
这两行并没有做(我假设)你认为他们正在做的事情。
my @array = undef;
这定义了一个具有单个元素的数组,该元素是特殊值undef。我怀疑你真正想要的是:
my @array = ();
创建一个空数组。但是 Perl 数组在第一次创建时总是空的,所以可以简化为:
my @array;
第二行重复了该错误并添加了一个新错误。
while (@array = undef) {
我怀疑您想在这里检查一个空数组,并且您正在寻找类似“if @array is undefined”的东西。但是您错过了这样一个事实,即在 Perl 中,赋值运算符(如 =)是不同的到比较运算符(如==)。所以这一行分配 undef 到@array 而不是比较它。你真的想要@array == undef - 但这也不对。
您需要摆脱这种检查数组是否“已定义”的想法。您真正感兴趣的是数组是否为空。 Perl 有一个聪明的技巧可以帮助你解决这个问题。
如果您在 Perl 期望看到单个(标量)值的地方使用 Perl 数组,它会为您提供数组中元素的数量。所以你可以编写如下代码:
my $number_of_elements = @an_array;
if 或while 条件中的布尔逻辑检查是单个标量值。所以如果你想检查一个数组是否包含任何元素,你可以使用这样的代码:
if (@array) {
# @array contains data
} else {
# @array is empty
}
当数组包含元素时循环,你可以简单地写:
while (@array) {
# do something
}
但是在这里,您想在数组为空时做一些事情。为此,您可以反转while 条件逻辑(使用! 表示“不”):
while (!@array) {
# do something
}
或者您可以切换到使用until 测试(与while 相反):
until (@array) {
# do something
}
我将不得不停在那里。我希望这能让您深入了解您的代码有什么问题。恐怕这种程度的错误也会渗透到您的其余代码中。